Happy Programming Contest ZOJ3703
老实说:题目意思没看懂。。。(希望路过的大神指点)
最后那个the total penalty time是什么意思啊!!!
还是学到点东西的。。。
解题的关键在于:要控制最后所用的时间最少,所以在程序的最开始应该先将输入的各种题目 以时间升序排列, 然后就可以保证每次都以时间小的优先选, 这样就可以保证最后相同的吸引值和解题数的情况下所花的时间最少。
1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 #include <cstdio> 5 #include <algorithm> 6 using namespace std; 7 struct Point 8 { 9 int t,v; 10 }p[55]; 11 bool cmp(Point left,Point right) 12 { 13 return left.t<right.t; 14 } 15 int dp[1005],pen[1005],pro[1005]; 16 int main () 17 { 18 int test;scanf("%d",&test); 19 while(test--) 20 { 21 int len,n; 22 scanf("%d%d",&len,&n); 23 memset(dp,0,sizeof(dp)); 24 memset(pro,0,sizeof(pro)); 25 memset(pen,0,sizeof(pen)); 26 for(int i=1;i<=n;++i) 27 scanf("%d",&p[i].t); 28 for(int i=1;i<=n;++i) 29 scanf("%d",&p[i].v); 30 int ans_val=0,ans_p=0,penalty=0; 31 sort(p+1,p+1+n,cmp); 32 for(int i=1;i<=n;++i) 33 { 34 for(int j=len;j>=p[i].t;--j) 35 { 36 bool flag=false; 37 if(dp[j-p[i].t]+p[i].v>dp[j]) 38 flag=true; 39 else if(dp[j-p[i].t]+p[i].v==dp[j] && pro[j-p[i].t]+1>pro[j]) 40 flag=true; 41 else if(dp[j-p[i].t]+p[i].v==dp[j] && pro[j-p[i].t]+1==pro[j] && pen[j-p[i].t]+j<pen[j]) 42 flag=true; 43 if(flag) 44 { 45 dp[j]=dp[j-p[i].t]+p[i].v; 46 pro[j]=pro[j-p[i].t]+1; 47 pen[j]=pen[j-p[i].t]+j; 48 49 } 50 } 51 } 52 for(int j=0;j<=len;++j) 53 { 54 bool flag=false; 55 if(ans_val<dp[j]) 56 flag=true; 57 else if(ans_val==dp[j] && ans_p<pro[j]) 58 flag=true; 59 else if(ans_val==dp[j] && ans_p<pro[j] && penalty>pen[j]) 60 flag=true; 61 if(flag) 62 { 63 ans_val=dp[j]; 64 ans_p=pro[j]; 65 penalty=pen[j]; 66 } 67 } 68 printf("%d %d %d ",ans_val,ans_p,penalty); 69 } 70 return 0; 71 }