time limit: 1 second
memory limit: 128 mb
小w發明了乙個遊戲,他在黑板上寫出了一行數字a1,a2,…an,然後給你m個回合的機會,每回合你可以從中選擇乙個數擦去它,接著剩下來的每個數字ai都要遞減乙個值bi如此重複m個回合,所有你擦去的數字之和就是你所得到的分數。 小w和他的好朋友小y玩了這個遊戲,可是他發現,對於每個給出的an和bn序列,小y的得分總是比他高。小w很不服氣,想讓你幫他算算,對於每個an和bn序列,可以得到的最大得分是多少。這樣他就知道有沒有可能超過小y的得分。
輸入檔案game.in的第1行,乙個整數n(1≤n≤200),表示數字的個數。 第2行,乙個整數m(1≤m≤n),表示回合數。 接下來一行有n個不超過10000的正整數,a1,a2,…an,表示原始數字 最後一行有n個不超過500的正整數,b1,b2,…bn,表示每回合每個數字遞減的值
乙個整數,表示最大可能的得分。結果輸出到檔案game.out。
3310 20 30
4 5 6
47【題解】
題意是這樣的。無論你選什麼數字。其他數字都會減去它相應的bi值,而不是說你選了數字k,然後其他數字減去bk。
這裡我們要注意。可能我們擦掉的數字是一樣的比如 1,2,3.
但是擦掉的順序不同。結果也是不同的。
那應該如何選擇順序?
可以想象我們選擇了a[i]和a[j],然後b[i] < b[j]。
那麼我們要先選哪乙個?
肯定是先選a[j]。因為我們可以避免a[j]在先選完a[i]之後減去較大的b[j];
可以寫出這樣ans=a[i]+a[j]-b[x].這個x就是後選的那乙個的下標。
顯然我們要讓b[x]最小。那就先選a[j]後選a[i]。這樣我們減去的就是較小的b[i]了。
知道了選擇的順序。接下來就要解決選哪些的問題了。
雖然優先選擇b[x]較大的。
但是如果有這樣的
a 10 100000
b 1000 2
然後m=1.也就是說我們只能選乙個。那我們肯定要選擇a[2]了。
又或者a 2000 200 10000
b 100 99 90
m=2時。我們也不能單純地選擇a[1],a[2]。而應該選擇a[1],a[3]。
綜上。我們得出這樣乙個演算法。
先把a按照b的大小降序排序。
然後,設f[i][j]表示前i個數,擦掉了j個數字得到的最大值。
f[i][j] = max;
int min(int a, int b) //返回a和b中的較小值
int max(int a, int b) //返回a和b中的較大值
int main()
} for (int i = 1; i <= n; i++)//進行dp
printf("%d\n", f[n][m]);//輸出答案。
return 0;
}
u128 又乙個數字遊戲
time limit 1 second memory limit 128 mb 問題描述 小明拿出了乙個素數集合,他發現,從小到大排序後,127是第31個數,而31也在素數集內,31是第 11個數,11是第5個數,5是第3個數,3是第2個數,2是第1個數。而127,31,11,5,3,2都為素數。這...
數字DP 數字遊戲
科協裡最近很流行數字遊戲。某人命名了一種不降數,這種數字必須滿足從左到右個位數字呈現小於等於的關係,如123,446.現在大家決定玩乙個遊戲,指定乙個整數閉區間 a,b 問這個區間內有多少個不降數。輸入多組測試資料。每組只包含兩個數字a和b 1 a,b 2 31 每行給出乙個測試資料的答案,即 a,...
數字DP 數字遊戲
科協裡最近很流行數字遊戲。某人命名了一種不降數,這種數字必須滿足從左到右各位數字呈非下降關係,如 123,446。現在大家決定玩乙個遊戲,指定乙個整數閉區間 a,b 問這個區間內有多少個不降數。輸入格式 輸入包含多組測試資料。每組資料佔一行,包含兩個整數 a 和 b。輸出格式 每行給出一組測試資料的...