数字游戏II
http://218.5.5.242:9018/JudgeOnline/problem.php?id=1440
题目描述
小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 3 10 20 30 4 5 6
样例输出
47
题解
如果要取俩个数,一定是每轮减少多的一个放在前面取
所以按照b降序排序
dp方程很好想。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct data{int a,b;}a[201]; int n,m,f[201][201]; inline bool cmp(data a,data b) {return a.b>b.b;} int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i].a); for(int i=1;i<=n;i++)scanf("%d",&a[i].b); sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) f[i][j]=max(f[i-1][j],f[i-1][j-1]+a[i].a-a[i].b*(j-1)); printf("%d",f[n][m]); return 0; } |
Subscribe