记录编号 79540 评测结果 AAAAAAAAAA
题目名称 垃圾陷阱 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2013-11-05 21:33:06 内存使用 0.47 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. using namespace std;
  7. //f[i][j]表示投入第i个垃圾后高度为j的最大剩余生命值,其中T=i表示可以使用i时刻之前的一切垃圾
  8. //①把这个垃圾摞起来:用f[i-1]中的每个状态去更新:f[i-1][j]-(两个垃圾的时间差)->f[i][j+这个垃圾的高度]
  9. //②壮士干了这碗热翔:用f[i-1]中的每个状态去更新:f[i-1][j]+(这个垃圾的时间)->f[i][j]
  10. //每次转移O(D),共转移G次
  11. const int SIZED=200,SIZEG=200;
  12. int D,G;//深度和垃圾数量
  13. int dp[SIZEG][SIZED]={0};
  14. int maxheight[SIZEG]={0};
  15. class RUBBISH{
  16. public:
  17. int t,f,h;
  18. //投入时间,能维持生命时间,垫高高度
  19. };
  20. RUBBISH rub[SIZEG];
  21. bool operator < (RUBBISH a,RUBBISH b){
  22. return a.t<b.t;
  23. }
  24. void DP(void){
  25. int i,j;
  26. for(i=0;i<=G;i++){
  27. for(j=0;j<=100;j++) dp[i][j]=-1;
  28. }
  29. rub[0].t=0;
  30. maxheight[0]=0;
  31. dp[0][0]=10;
  32. int nowh,nowf,dt;
  33. bool survive;
  34. for(i=1;i<=G;i++){
  35. survive=false;
  36. dt=rub[i].t-rub[i-1].t;
  37. nowh=rub[i].h;
  38. nowf=rub[i].f;
  39. //转移摞起来的
  40. for(j=0;j<=maxheight[i-1];j++){
  41. if(dp[i-1][j]-dt>=0){//没饿死
  42. dp[i][j+nowh]=max(dp[i][j+nowh],dp[i-1][j]-dt);
  43. survive=true;
  44. maxheight[i]=max(maxheight[i],j+nowh);
  45. }
  46. }
  47. //转移干热翔的
  48. for(j=0;j<=maxheight[i-1];j++){
  49. if(dp[i-1][j]-dt>=0){//没饿死
  50. dp[i][j]=max(dp[i][j],dp[i-1][j]-dt+nowf);
  51. survive=true;
  52. maxheight[i]=max(maxheight[i],j+nowh);
  53. }
  54. }
  55. if(!survive){
  56. break;
  57. }
  58. if(maxheight[i]>=D){
  59. printf("%d\n",rub[i].t);
  60. return;
  61. }
  62. }
  63. int sum=0;
  64. for(j=1;j<i;j++){
  65. sum+=rub[j].f;
  66. }
  67. printf("%d\n",sum+10);
  68. }
  69. void read(void){
  70. scanf("%d%d",&D,&G);
  71. int i;
  72. for(i=1;i<=G;i++) scanf("%d%d%d",&rub[i].t,&rub[i].f,&rub[i].h);
  73. }
  74. int main(){
  75. freopen("well.in","r",stdin);
  76. freopen("well.out","w",stdout);
  77. read();
  78. sort(rub+1,rub+1+G);
  79. DP();
  80. /*for(int i=0;i<=G;i++){
  81. for(int j=0;j<=10;j++) cout<<dp[i][j]<<" ";
  82. cout<<endl;
  83. }*/
  84. return 0;
  85. }