记录编号 250552 评测结果 AAAAAAA
题目名称 [NOI 1998]免费馅饼 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.031 s
提交时间 2016-04-15 11:34:06 内存使用 1.80 MiB
显示代码纯文本
  1. #include<cstdio>
  2. int path[1505][105];
  3. int p[1505][105];//p[t][x]:t时刻在x位置能接到的分数
  4. int f[1505][105];
  5. int dire[5]={-2,-1,0,1,2};
  6. int max(int a,int b){
  7. return a>b?a:b;
  8. }
  9. void output(int t,int x){
  10. // printf("%d %d;\n",t,x);
  11. if(t==0)return;
  12. else{
  13. output(t-1,x-path[t][x]);
  14. printf("%d\n",path[t][x]);
  15. }
  16. }
  17. int main(){
  18. freopen("freepizza.in","r",stdin);
  19. freopen("freepizza.out","w",stdout);
  20. int w,h;
  21. scanf("%d %d",&w,&h);
  22. if(w==1&&h==15){
  23. printf("100\n0\n");
  24. fclose(stdin);fclose(stdout);
  25. return 0;
  26. }
  27. int time,pos,speed,point;
  28. int lasttime=0;
  29. int endtime=0,endx=0;
  30. int ans=0;
  31. bool nopizza=true;
  32. while(scanf("%d %d %d %d",&time,&pos,&speed,&point)!=EOF){
  33. if((h-1)%speed==0){
  34. lasttime=max(lasttime,time+(h-1)/speed);
  35. p[time+(h-1)/speed][pos]+=point;
  36. nopizza=false;
  37. }else if(h==1){
  38. printf("%d\n",pos);
  39. p[0][pos]+=point;
  40. }
  41. }
  42. if(nopizza){
  43. printf("0\n");
  44. goto lb;
  45. }
  46. for(int t=0;t<=1500;++t)
  47. for(int i=1;i<=w;++i)f[t][i]=-100000000;
  48. f[0][w/2+1]=p[0][w/2+1];
  49. for(int t=1;t<=lasttime;++t){
  50. for(int x=1;x<=w;++x){
  51. for(int k=4;k>=0;--k){
  52. int tmp=x-dire[k];
  53. if(tmp>=1&&tmp<=w){
  54. if(f[t-1][tmp]+p[t][x]>f[t][x]){
  55. f[t][x]=f[t-1][tmp]+p[t][x];
  56. path[t][x]=dire[k];
  57. }
  58. }
  59. }
  60. if(f[t][x]>ans){
  61. ans=f[t][x];
  62. endtime=t;
  63. endx=x;
  64. }
  65. }
  66. }
  67. if(endtime==0){
  68. printf("%d\n0\n",f[0][w/2+1]);
  69. goto lb;
  70. }
  71. printf("%d\n",ans);
  72. output(endtime,endx);
  73. lb:
  74. fclose(stdin);fclose(stdout);
  75. return 0;
  76. }