2/11 P1156 垃圾陷阱

信心又一次被碾压了,,感觉自己好笨www
https://www.luogu.com.cn/problem/P1156
不想写太多,

不理解为什么要把深度作为cost,把时间作为value

想了想,大概是因为不管能不能出去,输出的都是时间,所以值是时间,引索是深度吧

那么就是正常的背包是,消耗空间(cost)同时 获得价值(value),求最大价值 value

这个题目是,得到空间(heigh)或者 获得价值(life),求最大价值 life

一般的背包:
dp [ j ] = max ( dp [ j ] , dp [ j - cost [ i ] ] + value [ i ] )

本题:
dp [ j + heigh [ i ] ] = max ( dp [ j ] , dp [ j + heigh [ i ] ] ) ;不吃掉的话
dp[j] = dp [ j ] + life [ i ] ;吃掉的话

同时,要是当前生命值不足以支撑到下一次垃圾进入,就跳过;
这一次垃圾要是堆起来能达到洞口就输出时间停止,
这俩是附加的,我一直以为达到洞口是目的,最大存活时间是附加,笨死了

#include <bits/stdc++.h>
using namespace std;
typedef long long int LL;
int dp[3010],d,g;
struct A{
	int t,l,h;
}a[110];
bool cmp(A a,A b)
{
	return a.t<b.t;
}
int main()
{
	cin>>d>>g;
	for(int i=1;i<=g;i++)
	{
		cin>>a[i].t>>a[i].l>>a[i].h;
	}
	dp[0]=10;
	sort(a+1,a+1+g,cmp);
	for(int i=1;i<=g;i++)
	{
		for(int j=d;j>=0;j--)
		{
			if(dp[j]>=a[i].t)
			{
				if(j+a[i].h>=d)
				{
					cout<<a[i].t;
					return 0;
				}
				dp[j+a[i].h]=max(dp[j],dp[j+a[i].h]);
				dp[j]+=a[i].l;
			}
		}
	}
	cout<<dp[0];
	return 0;
}
posted @   石磨豆浆  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示