1. 程式人生 > >洛谷 P1156 垃圾陷阱

洛谷 P1156 垃圾陷阱

pro mat getc spa tin getch main sort algorithm

傳送門:洛谷 P1156 垃圾陷阱
算法分析:
\(dp[i][j]\) 表示吃了第 \(i\) 個垃圾後到 \(j\) 高度的最大生命值,則先判斷能否活下來,如能,判斷有沒有跳出陷阱;若沒有,就分兩種情況:上升或活命。如果跳不出,就貪心求最大高度


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxN=100,maxH=100;
struct Node
{
    int t,f,h;
}a[maxN+1];
int d,n,dp[maxN+1][maxN+1],ans=0;
inline int read();
bool comp(Node x,Node y)
{
    return x.t<y.t;
}
int main()
{
    d=read(); n=read();
    memset(dp,-1,sizeof(dp));
    for(int i=1;i<=n;i++)
    {
        a[i].t=read();
        a[i].f=read();
        a[i].h=read();
    }
    dp[0][0]=10;
    sort(a+1,a+n+1,comp);
    for(int i=1;i<=n;i++)
        for(int j=0;j<=d;j++)
        {
            if(dp[i-1][j]<0) continue;
            if(dp[i-1][j]>=a[i].t-a[i-1].t && j+a[i].h>=d)
            {
                printf("%d",a[i].t);
                return 0;
            }
            if(dp[i-1][j]>=a[i].t-a[i-1].t)
            {
                dp[i][j+a[i].h]=dp[i-1][j]-a[i].t+a[i-1].t;  
                dp[i][j]=max(dp[i][j],dp[i-1][j]-a[i].t+a[i-1].t+a[i].f);
            }
        }
    for(int i=1;i<=n;i++)
        for(int j=0;j<=d;j++)
            if(dp[i][j]!=-1) ans=max(ans,dp[i][j]+a[i].t);
    printf("%d",ans);
    return 0;
}
inline int read()
{
    char ch=getchar();
    int f=1,num=0;
    while((ch<‘0‘ || ch>‘9‘) && ch!=‘-‘) ch=getchar();
    if(ch==‘-‘) {f=-1; ch=getchar();} 
    while(ch>=‘0‘ && ch<=‘9‘)
    {
        num=num*10+ch-‘0‘;
        ch=getchar();
    }
    return num*f;
}

洛谷 P1156 垃圾陷阱