比赛 10.10.18noip模拟 评测结果 AAAAAAAAAA
题目名称 罪犯问题B 最终得分 100
用户昵称 Pom 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2010-10-18 21:28:07
显示代码纯文本
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <cstdlib>
  6.  
  7. using namespace std;
  8.  
  9. const int MAXN=1010;
  10. const int MAXM=50050;
  11.  
  12. int n,m,k,i,j,c[MAXN],a[MAXN],b[MAXN],f[2][MAXM],ans1,ans2;
  13.  
  14. int main()
  15. {
  16. freopen("criminalb.in","r",stdin);
  17. freopen("criminalb.out","w",stdout);
  18. scanf("%d%d%d",&n,&m,&k);
  19. for (i=1;i<=n;i++)
  20. scanf("%d",&c[i]);
  21. for (i=1;i<=m;i++)
  22. {
  23. scanf("%d",&j);
  24. if (j>0) a[j]++;
  25. else b[-j]++;
  26. }
  27. for (j=0;j<=k;j++)
  28. f[0][j]=f[1][j]=-2000000000;
  29. f[0][0]=0;
  30. for (i=1;i<=n;i++)
  31. for (j=0;j<=k;j++)
  32. {
  33. f[i%2][j]=-2000000000;
  34. if (b[i]<=j) f[i%2][j]=f[(i+1)%2][j-b[i]]+c[i];
  35. if (a[i]<=j) f[i%2][j]=max(f[i%2][j],f[(i+1)%2][j-a[i]]);
  36. }
  37. ans1=-2000000000;
  38. for (i=0;i<=k;i++)
  39. if (f[n%2][i]>ans1) ans1=f[n%2][i];
  40. printf("%d\n",ans1);
  41. for (j=0;j<=k;j++)
  42. f[0][j]=f[1][j]=2000000000;
  43. f[0][0]=0;
  44. for (i=1;i<=n;i++)
  45. for (j=0;j<=k;j++)
  46. {
  47. f[i%2][j]=2000000000;
  48. if (b[i]<=j) f[i%2][j]=f[(i+1)%2][j-b[i]]+c[i];
  49. if (a[i]<=j) f[i%2][j]=min(f[i%2][j],f[(i+1)%2][j-a[i]]);
  50. }
  51.  
  52. ans2=2000000000;
  53. for (i=0;i<=k;i++)
  54. if (f[n%2][i]<ans2) ans2=f[n%2][i];
  55. printf("%d\n",ans2);
  56. return 0;
  57. }