题目链接:oj22858
题意:给一个井的深度,再给你G个垃圾,每个垃圾有其到达时间,吃掉这垃圾能延长寿命时间或者用这个垃圾来垒成梯子,人初始时间为10。问:最快什么时间能逃离,要是不能逃离,存活最晚的时间是多少?
题解:01背包变形。参考集训队大佬帅辉的思路,牛逼。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{
int t,f,h;
}ans[110];
bool cmp(node a,node b){
return a.t<b.t;
}
int dp[5000];///定义高度为i,存活时间为
int main()
{
int n,m;
scanf("%d%d",&n,&m);
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&ans[i].t,&ans[i].f,&ans[i].h);
}
sort(ans+1,ans+1+m,cmp);
dp[0]=10;///初始化,高度为0,能存活的时间
bool flag=1;
for(int i=1;i<=m&&flag;i++)
{
for(int j=n;j>=0;j--)///01背包从大往后
{
if(dp[j]>=ans[i].t) ///当前高度存活的时间大于垃圾到来的时间
{
if(j+ans[i].h>=n){///如果此时加上垃圾到来的高度已经满足结果,那么此时一定是最短时间
printf("%d\n",ans[i].t);
flag=0;break;
}
dp[j+ans[i].h]=max(dp[j+ans[i].h],dp[j]);///当前高度加上垃圾高度,取原来高度所用时间与事成之后所用时间的最大值
dp[j]+=ans[i].f;///当前高度不增加,那么我们就加上此时的时间
}
}
}
if(flag){
printf("%d\n",dp[0]);
}
return 0;
}