题目大意:要求你从n个人中选出m个,每个人有两个值p[i],D[i],要求选出的人p总和与D总和的差值最小。若有相同解,则输出p总+D总最大的方案。
动态规划。
一直在想到底是n枚举外面还是m放外面,好像两者都可以?
做了越来越多的那种“当前层改变下一层”,乍一看题解还以为这是道斜率优化呢。
#include<cstdio> #include<cstring> #include<algorithm> #define inf 1000000000 using namespace std; int cas,minpd,n,m; ][],path[][],answer[]; ],b[]; int main() { scanf("%d%d",&n,&m); ||m!=) { cas++;printf("Jury #%d\n",cas); ;i<=n;i++)scanf("%d%d",&a[i],&b[i]); memset(f,-,,sizeof(path)); minpd=m*; f[][minpd]=; ;j<m;j++) ;k<=minpd*;k++) ;i<=n;i++) &&f[j][k]+a[i]+b[i]>f[j+][k+a[i]-b[i]]) { int t1=j,t2=k; &&path[t1][t2]!=i) { t2-=a[path[t1][t2]]-b[path[t1][t2]];t1--; } ) { f[j+][k+a[i]-b[i]]=f[j][k]+a[i]+b[i]; path[j+][k+a[i]-b[i]]=i; } } ,k; &&f[m][i-j]<)j++; if(f[m][i+j]<f[m][i-j])k=i-j;else k=i+j; printf("Best jury has value %d for prosecution and value %d for defence:\n", (k-minpd+f[m][k])/,(f[m][k]-k+minpd)/); ;i<=m;i++) { answer[i]=path[m-i+][k]; k-=a[answer[i]]-b[answer[i]]; } sort(answer+,answer+m+); ;i<=m;i++)printf("%d ",answer[i]); printf("\n\n"); scanf("%d%d",&n,&m); } }
poj1015
最近感觉剪贴板出了点问题,代码提交上去动不动就是too long。。。