洛谷 P1156 垃圾陷阱

Posted Neptune

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1156 垃圾陷阱相关的知识,希望对你有一定的参考价值。

2016-05-31 09:54:03

题目链接 :洛谷 P1156 垃圾陷阱

题目大意:

  奶牛掉坑里了,给定坑的深度和方块的个数,每个方块都可以垫脚或者吃掉维持生命(初始为10)

  若可以出来,求奶牛最早出来的时间,若出不来,求奶牛最长存活时间

解法:

  背包DP

  DP[i]表示在可以存活到i时刻的情况下,最大能到达的高度

  每个状态的转移无非两种

    1.垫脚 DP[i]+=a[k].h;

    2.吃掉 DP[i+a[k].f]=max(DP[i+a[k].f],DP[i]);

  初始:DP[10]=0;

  如果死了,就直接待在原地不动,一直吃,就可以得到最大时间.

需要注意的地方:

  1.每个方块DP完都要扫一次结果是否满足,满足直接退.

  2.时间的上限从max(a[i].t)开始就行了,因为活得比最后一个方块下落时间还久没啥意义(还不如垫脚)

 1 //垃圾陷阱 (洛谷 No.1156)
 2 //背包DP
 3 #include<stdio.h>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=1100;
 7 const int maxm=110;
 8 int DP[maxn];
 9 int D,G;
10 struct node
11 {
12     int t,f,h;
13 };
14 node a[maxm];
15 bool comp(node a,node b)
16 {
17     return a.t<b.t;
18 }
19 int main()
20 {
21     scanf("%d %d",&D,&G);
22     fill(DP,DP+maxn,-100000);
23     DP[10]=0;
24     for(int i=1;i<=G;i++)
25     {
26         scanf("%d %d %d",&a[i].t,&a[i].f,&a[i].h);        
27     }
28     sort(a+1,a+1+G,comp);
29     for(int i=1;i<=G;i++)
30     {
31         for(int j=a[G].t;j>=a[i].t;j--)
32         {
33             DP[j+a[i].f]=max(DP[j+a[i].f],DP[j]);
34             DP[j]+=a[i].h;
35         }
36         for(int j=a[G].t+a[i].f;j>=a[i].t;j--)
37         {
38             if(DP[j]>=D)
39             {
40                 printf("%d\n",a[i].t);
41                 return 0;
42             }
43         }
44     }
45     int F=10;
46     for(int i=1;i<=G&&F>=a[i].t;i++)
47     {
48         F+=a[i].f;
49     }
50     printf("%d\n",F);
51     return 0;
52 }

 

以上是关于洛谷 P1156 垃圾陷阱的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 [P1156] 垃圾陷阱

洛谷 P1156 CodeVS 1684 垃圾陷阱

洛谷P1156 垃圾陷阱[背包DP]

P1156 垃圾陷阱

洛谷P1156辣鸡陷阱

题解P1156垃圾陷阱