Kgds
人生如此复杂,机会多得像稠密图,我们没理由认输。尽管我们走不了最短路,但图仍是连通图,TLE之前,没有一个节点叫失败。           

垃圾陷阱

垃圾陷阱

#1:堆放垃圾以及吃垃圾不耗费时间
#2:根据题目得知没一波垃圾只有两种处理方法:吃掉、堆起来,因此使用一维dp就能AC,dp[i]表示高度为i时最高生命值为dp[i]
#3:虽然说堆得越高出井的越快,但也不应该先考虑堆起来,因为这样不能保证不饿死,所以应求在同一高度中最高生命值
#4:要将数据按时间排序
#5:不要忽略时间,时间决定人的生死与出井的时间
 1 #include<stdio.h>
 2 #include<algorithm>
 3 #define max(a,b) a>b?a:b
 4 using namespace std;
 5 /*
 6 初始值生命值, 
 7 即dp[0]为10, 
 8 dp[i]表示当高度为i时最大的生命值 
 9 */ 
10 int d,g,dp[110]={10};
11 struct data{int t,f,h;}s[110];
12 bool cmp(data a,data b)
13 {
14     return a.t<b.t;
15 }
16 int main()
17 {
18     scanf("%d%d",&d,&g);
19     for(int i=1;i<=g;++i)
20         scanf("%d%d%d",&s[i].t,&s[i].f,&s[i].h);
21     //按时间排序(STL美滋滋) 
22     sort(s+1,s+1+g,cmp);
23     //枚举掉落的垃圾 
24     for(int i=1;i<=g;++i)
25     {
26         //枚举高度 
27         for(int j=d;j>=0;--j)
28         {
29             if(dp[j]>=s[i].t)
30             {
31                 //如果当前高度+当前垃圾的高度 ≥井的高度则直接输出当前时间
32                 if(j+s[i].h>=d)
33                 {
34                     printf("%d",s[i].t);
35                     return 0;
36                 }
37                 //使高度为j+s[i].h时的生命值最大
38                 dp[j+s[i].h]=max(dp[j],dp[j+s[i].h]);
39                 //吃垃圾,即更新dp[j]的最大生命值
40                 dp[j]+=s[i].f;
41             }
42         }
43     }
44     //如果没有出去输出他活了多长时间 
45     printf("%d",dp[0]);
46 }
posted @ 2018-07-19 15:26  Kgds  阅读(130)  评论(0编辑  收藏  举报