码迷,mamicode.com
首页 > 其他好文 > 详细

【题解】luogu p1156 垃圾陷阱

时间:2019-08-18 00:03:11      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:nod   直接   div   clu   set   names   span   std   判断   

背包

总结:

1.状态要根据问的问题设计,一开始我设计dp[i]是在i时间时的最高高度,而题目卡门最长可以活多久,这样设计的话若不能出去,则这个不好判断。所以设计为dp[i]是在i的高度时,卡门最多可以后活多久,这样问题便迎刃而解。

2.不用将牛的寿命减去时间,直接将牛可以存活的时间与当前时间比较即可。

3.关于状态设计时,  dp[j+a[i].h] = max(dp[j+a[i].h], dp[j]);这个是选择堆积时,我们这时候直接选择最大的寿命即可
            dp[j] += a[i].f; 这个是选则吃垃圾时的最大寿命。

 

#include<bits/stdc++.h>
using namespace std;
struct node{
    int t, f, h;
}a[105];
int d, g, dp[105];

bool cmp(node x, node y)
{
    return x.t < y.t;
}

int main()
{
    cin >> d >> g;
    for(int i = 1; i <= g; i++)
        cin >> a[i].t >> a[i].f >> a[i].h;
    sort(a+1, a+1+g, cmp);
    memset(dp, -0x3f, sizeof(dp));
    dp[0] = 10;
    for(int i = 1; i <= g; i++)
        for(int j = d; j >= 0; j--)
            if(dp[j] >= a[i].t)
            {
                if(a[i].h+j >= d)
                {
                    cout << a[i].t;
                    return 0;
                }
                dp[j+a[i].h] = max(dp[j+a[i].h], dp[j]);
                dp[j] += a[i].f;
            }
    cout << dp[0];
    return 0;
    
    
} 

 

【题解】luogu p1156 垃圾陷阱

标签:nod   直接   div   clu   set   names   span   std   判断   

原文地址:https://www.cnblogs.com/lovezxy520/p/11370832.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!