time limit: 1 secs, memory limit: 32 mb
小w發明了乙個遊戲,他在黑板上寫出了一行數字a1,a2,….an,然後給你m個回合的機會,每回合你可以從中選擇乙個數擦去它,接著剩下來的每個數字ai都要遞減乙個值bi。如此重複m個回合,所有你擦去的數字之和就是你所得到的分數。
小w和他的好朋友小y玩了這個遊戲,可是他發現,對於每個給出的an和bn序列,小y的得分總是比他高,所以他就很不服氣。於是他想讓你幫他算算,對於每個an和bn序列,可以得到的最大得分是多少。這樣他就知道有沒有可能超過小y的得分。
第一行,乙個整數n(1<=n<=200),表示數字的個數。
第二行,乙個整數m(1<=m<=n),表示回合數。
接下來一行有n個不超過10000的正整數,a1,a2…an,表示原始數字
最後一行有n個不超過500的正整數,b1,b2….bn,表示每回合每個數字遞減的值
乙個整數,表示最大可能的得分
3310 20 30
4 5 6
47zsuacm team member
solution
一開始想用貪心,但是考慮到了時間的限制,貪心是有漏洞的,可能小數的遞減很小,大數的遞減很大,導致在某一時候還不如選擇小數。
然後問題的求解是和時間有關的,試著用dp。
問題看作是容量為m的揹包,數字的權重是數值,和時間有關,為a[i]-(j-1)*b[i],j可以看作是時間,也可以看做是容量,因為一回合一秒。
把j看作是容量的話就很容易寫出狀態轉移方程了:f[j]=max(f[j], f[j-1]+a[i]-(j-1)*b[j]),注意要先排序。
狀態轉移方程的意思就是當取第i件物品第j回合的時候取好還是不取好。
#include #include #include using namespace std;
int a[205], b[205], r[205], f[205];
bool cmp(const int x, const int y)
int main()
printf("%d\n", f[m]);
return 0;
}
Sicily 1221 數字遊戲
time limit 1 secs,memory limit 32 mb 小w發明了乙個遊戲,他在黑板上寫出了一行數字a1,a2,an,然後給你m個回合的機會,每回合你可以從中選擇乙個數擦去它,接著剩下來的每個數字ai都要遞減乙個值bi。如此重複m個回合,所有你擦去的數字之和就是你所得到的分數。小w...
Sicily1221 數字遊戲 week 10
time limit 1 secs,memory limit 32 mb 小w發明了乙個遊戲,他在黑板上寫出了一行數字a1,a2,an,然後給你m個回合的機會,每回合你可以從中選擇乙個數擦去它,接著剩下來的每個數字ai都要遞減乙個值bi。如此重複m個回合,所有你擦去的數字之和就是你所得到的分數。小w...
動態規劃 sicily1221
解題思路 題目有個地方,我理解錯了,導致wa很多次,問題是當你擦除a i 時,你要將它對應的b i 去減剩餘的序列,之前一直以為第i輪就減去b i orz。簡單的動態,dp i 表示去到第i輪時的最大擦出和。按照我們直觀的思路,肯定是最大消費的 也就是b i 比較大的 應該先拿掉,因此我們先按照co...