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 51 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對於第三個樣例:先選任何乙個值為2的元素,最後陣列內剩下4個2。然後4次選擇2,最終得到10分。21 2
output
2input
31 2 3
output
4input
91 2 1 3 2 2 2 2 3
output
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 ...