解題思路:
題目有個地方,我理解錯了,導致wa很多次,問題是當你擦除a[i]時,你要將它對應的b[i]去減剩餘的序列,之前一直以為第i輪就減去b[i],orz。
簡單的動態,dp[i]表示去到第i輪時的最大擦出和。
按照我們直觀的思路,肯定是最大消費的(也就是b[i]比較大的)應該先拿掉,因此我們先按照cost排序。
dp[j] = min;
原始碼如下:
/*
* main.cpp
* * created on: sep 23, 2011
* author: raphealguo
*/#include #include #include #include using namespace std;
#define maxl 210
struct node;
bool cmp(node a, node b)
int main()
for (i = 0; i < n; ++i)
sort(nodes, nodes+n, cmp);
for (i = 0; i < n; ++i)}}
printf("%d\n", dp[m]);
}}
附帶原題:
小 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
Sicily 1221 數字遊戲
time limit 1 secs,memory limit 32 mb 小w發明了乙個遊戲,他在黑板上寫出了一行數字a1,a2,an,然後給你m個回合的機會,每回合你可以從中選擇乙個數擦去它,接著剩下來的每個數字ai都要遞減乙個值bi。如此重複m個回合,所有你擦去的數字之和就是你所得到的分數。小w...
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...