u012 數字遊戲

2021-09-28 10:05:21 字數 1474 閱讀 6150

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。

3

310 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。輸出格式 每行給出一組測試資料的...