程式設計思維與實踐 Week10 作業

2021-10-06 03:57:33 字數 3070 閱讀 4435

b - lis & lcs

c - 拿數問題 ii

東東在玩遊戲「game23」。在一開始他有乙個數字n,他的目標是把它轉換成m,在每一步操作中,他可以將n乘以2或乘以3,他可以進行任意次操作。輸出將n轉換成m的操作次數,如果轉換不了輸出-1。

輸入的唯一一行包括兩個整數n和m(1<=n<=m<=5*10^8).

輸出從n轉換到m的操作次數,否則輸出-1.

120 51840

42 42

48 72

-1

先將m中的n除去,如果n可以通過乘2乘3轉成m,那麼n一定是m的因子,因此可以進行第一次判斷,如果m不能被n整除,則不能實現。

如果可以整除,先將整除後的數,進行迴圈除3,將所有3因子都除盡,則得到的數就只剩2因子或者還有其他的因子。

在算出這個除完3後的數是2的多少次冪,進行反向驗證,驗證成功則可以實現,否則不能。

**如下:

#include

#include

using

namespace std;

/*a*/

intmain()

else

long

long temp =

log2

(m);

long

long atemp =

pow(

2, temp);if

(m % atemp ==0)

else

} cout << ans << endl;

}

東東有兩個序列a和b。他想要知道序列a的lis和序列ab的lcs的長度。注意,lis為嚴格遞增的,即a1第一行兩個數n,m(1<=n<=5,000,1<=m<=5,000)

第二行n個數,表示序列a

第三行m個數,表示序列b

這裡是引用輸出一行資料ans1和ans2,分別代表序列a的lis和序列ab的lcs的長度

5 5

1 3 2 5 4

2 4 3 1 5

3 2

對於lis:定義乙個陣列f,f[i]存放的是第1到第i個數的最長上公升子串行。

初始條件f陣列全初始化為1,

那麼對於j#include

#include

#include

using

namespace std;

/*b*/

int a[

5010

], b[

5010];

int f[

5010];

int f1[

5010][

5010];

int ans;

intmain()

for(

int i =

1; i <= m; i++

) f[1]

=1; ans =0;

int maxf =0;

for(

int i =

1; i <= n; i++)}

f[i]

= maxf +1;

ans =

max(ans, f[i]);

} f1[1]

[0]=

0;f1[0]

[1]=

0;f1[0]

[0]=

0;for(

int i =

1; i <= n; i++

)else}}

cout << ans <<

" "<< f1[n]

[m]<< endl;

}yjq 上完第10周的程式設計思維與實踐後,想到乙個絕妙的主意,他對拿數問題做了一點小修改,使得這道題變成了 拿數問題 ii。

給乙個序列,裡邊有 n 個數,每一步能拿走乙個數,比如拿第 i 個數, ai = x,得到相應的分數 x,但拿掉這個 ai 後,x+1 和 x-1 (如果有 aj = x+1 或 aj = x-1 存在) 就會變得不可拿(但是有 aj = x 的話可以繼續拿這個 x)。求最大分數。

本題和課上講的有些許不一樣,但是核心是一樣,需要你自己思考。

第一行包含乙個整數 n (1 ≤ n ≤ 105),表示數字裡的元素的個數第二行包含n個整數a1, a2, …, an (1 ≤ ai ≤ 105)

輸出乙個整數:n你能得到最大分值。

input

21 2

output

2input

31 2 3

output

4input

91 2 1 3 2 2 2 2 3

output

10

對於第三個樣例:先選任何乙個值為2的元素,最後陣列內剩下4個2。然後4次選擇2,最終得到10分。

用i,j統計這組資料的上下界,方便後續的遍歷。

統計輸入的資料每個數出現的次數。

進行拿取,

狀態方程dp[i] = max(dp[i - 1], dp[i - 2] + i * sum[i]);最終的結果即為dp[j].

#include

#include

#include

#include

using

namespace std;

/*c*/

long

long dp[

100010];

long

long sum[

100010];

intmain()

//dp[i] = i * sum[i];

for(

long

long k = i; k <= j; k++

) cout << dp[j]

<< endl;

}

程式設計思維與實踐 Week10 作業

給定兩個數n nn和m mm,輸出n nn經過若干次乘2或乘3後轉換為m mm的次數 首先判斷m是否能被n整除,如果能夠整除,將m除以n,之後進行迴圈,每次對m除以2或者除以3,直到m 1為止,若某次迴圈m沒有除以2或3,即次數沒有改變,說明無法轉換。include using namespace ...

SDU程式設計思維與實踐作業Week10

1本題直接暴力就可以了 include 321.lis 最長上公升子串行 嚴格遞增 我們只需要記錄0 i的最長上公升子串行就可以了 計算i 1時 若 存在j include using namespace std const int maxn 1e4 long long a maxn b maxn ...

SDU程式設計思維Week10 作業 A 簽到題

一開始他有乙個數字n,他的目標是把它轉換成m,在每一步操作中,他可以將n乘以2或乘以3,他可以進行任意次操作。輸入的唯一一行包括兩個整數n和m 1 n m 5 10 8 輸出將n轉換成m的操作次數,如果轉換不了輸出 1。input 1 12051840 output 1 7input 2 4242 ...