GREEN垃圾陷阱WELL

原文链接: https://www.luogu.org/problemnew/solution/P1156

题面:卡门——农夫约翰极其珍视的一条Holsteins奶牛——已经落了到“垃圾井”中。“垃圾井”是农夫们扔垃圾的地方,它的深度为D (2 <= D <= 100)英尺。

卡门想把垃圾堆起来,等到堆得与井同样高时,她就能逃出井外了。另外,卡门可以通过吃一些垃圾来维持自己的生命。

每个垃圾都可以用来吃或堆放,并且堆放垃圾不用花费卡门的时间。

假设卡门预先知道了每个垃圾扔下的时间t(0,以及每个垃圾堆放的高度h(1<=h<=25)< span="">和吃进该垃圾能维持生命的时间f(1<=f<=30)< span="">,要求出卡门最早能逃出井外的时间,假设卡门当前体内有足够持续10小时的能量,如果卡门10小时内没有进食,卡门就将饿死。

输入
第一行为2个整数,D 和 G (1 <= G <= 100),G为被投入井的垃圾的数量。 第二到第G+1行每行包括3个整数:T (0 < T <= 1000),表示垃圾被投进井中的时间;F (1 <= F <= 30),表示该垃圾能维持卡门生命的时间;和 H (1 <= H <= 25),该垃圾能垫高的高度。

输出
如果卡门可以爬出陷阱,输出一个整表示最早什么时候可以爬出;否则输出卡门最长可以存活多长时间

样例输入
20 4
5 4 9
9 3 2
12 6 10
13 1 1
样例输出
13

这道题很容易想到背包,但是具体如何设定还是没想出来。在看了luogu一篇博客后豁然开朗

设dp[i][j]表示前i个垃圾(注意一定要先按垃圾出现时间排序好),到达高度j时所拥有的最长的生命时间。

那么dp[i][j]=max(dp[i][j],dp[i-1][j]+a[i].v-(a[i].t-a[i-1].t))(吃,不填)

dp[i][j]=max(dp[i][j],dp[i-1][j-a[i].h]-(a[i].t-a[i-1].t))(不吃,填)

如果有一个dp[i][j]>=0且j+a[i].h>=D,那么就走出去了,
不然就是在dp[i][0]+a[i].t中取个最大值就好了。
搞一个滚动数组优化一下空间

上代码`

#include<bits/stdc++.h>
using namespace std;
const int inf=1e7;
inline int read()
{
    int data=0;int w=1; char ch=0;
    ch=getchar();
    while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();
    if(ch=='-') w=-1,ch=getchar();
    while(ch>='0' && ch<='9') data=(data<<3)+(data<<1)+ch-'0',ch=getchar();
    return data*w;
}
const int N=110;
int d,g;
struct node{int t,f,h;}a[N];
bool cmp(const node &x,const node &y){return x.t<y.t;}
int dp[2][1001];
int main(){
	d=read();g=read();int res=-inf;
	for(int i=1;i<=g;i++){a[i].t=read();a[i].f=read();a[i].h=read(); }
	sort(a+1,a+g+1,cmp);
	dp[0][0]=10;a[0].t=0;
	for(int i=1;i<=g;i++){
		int cur=i&1,pre=cur^1;
		memset(dp[cur],128,sizeof(dp[cur]));
		for(int j=d;j>=0;j--){
			if(dp[pre][j]<a[i].t-a[i-1].t) continue;
			if(j+a[i].h>=d) {
				printf("%d",a[i].t);return 0;
			}
			dp[cur][j+a[i].h]=max(dp[cur][j+a[i].h],dp[pre][j]-(a[i].t-a[i-1].t));
	        dp[cur][j]=max(dp[cur][j],dp[pre][j]+a[i].f-(a[i].t-a[i-1].t));
		} 
		res=max(res,dp[cur][0]+a[i].t);
	}
	printf("%d",res);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Stevencwehf/article/details/102709183
今日推荐