数字游戏
jzoj 2131
题目大意:
有n个数,每个数有相应的aia_iai和bib_ibi,当选了一个数后结果加上aia_iai,其他数分别减去他们自己的aja_jaj,现在让你选m个数,结果最大是多少
输入样例
3
3
10 20 30
4 5 6
输出样例
47
数据范围
1⩽m⩽n⩽20001\leqslant m\leqslant n\leqslant 20001⩽m⩽n⩽2000
解题思路:
先按b从大到小排个序,然后就实现了尽量减少每个数字减去的数,然后直接DP即可
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,f[2500][2500];
struct rec
{int a,b;
}a[2500];
bool cmp(rec x,rec y){return x.b>y.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+1+n,cmp);//排序memset(f,-127/3,sizeof(f));//预处理f[1][1]=a[1].a;for (int i=2;i<=n;++i)f[i][1]=max(f[i-1][1],a[i].a);for (int i=1;i<=n;++i)for (int j=2;j<=m;++j)f[i][j]=max(f[i-1][j],f[i-1][j-1]+a[i].a-a[i].b*(j-1));//要不不选,如果选了,就要减去已选的数字*bprintf("%d",f[n][m]);return 0;
}