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;
}

浙公网安备 33010602011771号