問題描述
輸入格式
第一行包含兩個個整數n和k。
第二行包含n個整數a1, a2, ... an。
對於30%的資料,1 <= n <= 10
對於100%的資料,1 <= n <= 100000, 0 <= ai <= 100000, 0 <= k <= 100000
輸出格式
乙個整數,代表答案。
樣例輸入
10 0
1 4 2 8 5 7 1 4 2 8
樣例輸出
有思路的話,**馬上就能寫出來,其實一開始看到題目給的資料範圍的時候就基本可以確定是貪心或者是用動態規劃去做了,就是這種先分類再動規的方式真的很少見,也算是學習到了一種新的思路了吧。
分析:將數分為如下的k類:
0, 0 + k, 0 + 2k, 0 + 3k....
1, 1 + k, 1 + 2k, 1 + 3k....
k - 1, (k - 1) + k, (k - 1) + 2k, (k - 1) + 3k...
1. 不同類中的兩個數,他們的差不是k. 這樣乙個類中有多少數 對 其他類中選擇什麼數沒有任何影響。
2. 整體的最優解,就是k個類的最優解之和,剩下的問題就是如何求乙個類中的最優解。
3. dp[m] = max(dp[m - k], dp[m - 2 * k] + cnt[m]); //cnt[m]是資料中m出現的次數
#include #include #include #define max_n 100000
using namespace std;
int main()
int ans = 0;
if(k == 0)
}}else
ans += temp;}}
cout << ans << endl;
return 0;
}
**很醜,見笑了。 歷屆試題 PREV 52 小數第n位
問題描述 我們知道,整數做除法時,有時得到有限小數,有時得到無限迴圈小數。如果我們把有限小數的末尾加上無限多個0,它們就有了統一的形式。本題的任務是 在上面的約定下,求整數除法小數點後的第n位開始的3位數。輸入格式 一行三個整數 a b n,用空格分開。a是被除數,b是除數,n是所求的小數後位置 0...
歷屆試題 小數第n位
問題描述 我們知道,整數做除法時,有時得到有限小數,有時得到無限迴圈小數。如果我們把有限小數的末尾加上無限多個0,它們就有了統一的形式。本題的任務是 在上面的約定下,求整數除法小數點後的第n位開始的3位數。輸入格式 一行三個整數 a b n,用空格分開。a是被除數,b是除數,n是所求的小數後位置 0...
歷屆試題 小數第n位
問題描述 我們知道,整數做除法時,有時得到有限小數,有時得到無限迴圈小數。如果我們把有限小數的末尾加上無限多個0,它們就有了統一的形式。本題的任務是 在上面的約定下,求整數除法小數點後的第n位開始的3位數。輸入格式 一行三個整數 a b n,用空格分開。a是被除數,b是除數,n是所求的小數後位置 0...