給定兩個數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 std;
intmain()
else
if(m %3==
0)if(t == ans)}if
(m ==
1) cout << ans << endl;
}return0;
}
給定兩個序列a和b。
求序列a的lis和序列ab的lcs的長度。
這道題可以分為兩個部分,求取最長上公升子串行和求取最長公共子串行。
lis:
lcs:
#include
#include
using
namespace std;
int a[
5010
], b[
5010];
int f[
5010];
int f1[
5010][
5010];
intmain()
f[i]
= maxx +1;
}int maxx =0;
for(
int i =
1; i <= n;
++i)
if(f[i]
> maxx) maxx = f[i]
; cout << maxx <<
' ';
f1[1]
[0]= f1[0]
[1]= f1[0]
[0]=
0;for(
int i =
1; i <= n;
++i)
} cout << f1[n]
[m];
return0;
}
給 n 個數,每一步能拿走乙個數,比如拿第 i 個數, ai = x,得到相應的分數 x,但拿掉這個 ai 後,x+1 和 x-1 (如果有 aj = x+1 或 aj = x-1 存在) 就會變得不可拿(但是有 aj = x 的話可以繼續拿這個 x)。求最大分數。
我們使用 cnt
[i
]cnt[i]
cnt[i]
表示數 i
ii 的個數
#include
#include
using
namespace std;
long
long dp[
100010];
long
long cnt[
100010];
intmain()
dp[1]
= cnt[1]
; dp[2]
=max
(cnt[2]
*2, dp[1]
);for(
int i =
3; i <= maxx;
++i)
dp[i]
=max
(dp[i-1]
, dp[i-2]
+ cnt[i]
* i)
; cout << dp[maxx]
<< endl;
return0;
}
程式設計思維與實踐 Week10 作業
b lis lcs c 拿數問題 ii 東東在玩遊戲 game23 在一開始他有乙個數字n,他的目標是把它轉換成m,在每一步操作中,他可以將n乘以2或乘以3,他可以進行任意次操作。輸出將n轉換成m的操作次數,如果轉換不了輸出 1。輸入的唯一一行包括兩個整數n和m 1 n m 5 10 8 輸出從n轉...
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 ...