【动态规划】[luoguP1156]垃圾陷阱

来源:互联网 发布:伺服电机plc编程实例 编辑:程序博客网 时间:2024/05/21 18:34

题目

用f[i][j]表示在投放第i个垃圾时垃圾高度为j的情况下最多能活到哪个时刻
因为可能这头牛活不到投最后一个垃圾的时候 所以最后要求ans
dp过程中第一次高度相加能大于等于h的时候这个时间就是最优解 可以直接输出时间 退出

代码如下

#include<iostream>#include<cstdio>#include<cctype>#include<algorithm>    using namespace std;    #define in = read();    typedef long long ll;    typedef unsigned int ui;    const ll size = 1000 + 100;        struct point{   int t , f , h;}data[size];            int d , g;            int num , ans;            int f[size][size];inline ll read(){        ll num = 0 , f = 1;    char ch = getchar();        while(!isdigit(ch)){                if(ch == '-')   f = -1;                ch = getchar();        }        while(isdigit(ch)){                num = num*10 + ch - '0';                ch = getchar();        }        return num*f;}inline bool cmp(point a , point b){        return a.t < b.t;}int main(){        d in;   g in;        for(register int i=1;i<=g;i++){                data[i].t in;                data[i].f in;                data[i].h in;        }        f[0][0] = 10;        sort(data + 1 , data + g + 1 , cmp);        for(register int i=0;i<g;i++)                for(register int j=0;j<=d;j++)                        if(f[i][j] >= data[i + 1].t){                                num = j + data[i + 1].h;                                if(num >= d){                                        printf("%d" , data[i + 1].t);                                        return 0;                                }                                f[i + 1][j] = max(f[i + 1][j] , f[i][j] + data[i + 1].f);                                f[i + 1][num] = max(f[i + 1][num] , f[i][j]);                        }        for(register int i=1;i<=g;i++)                ans = max(ans , f[i][0]);        printf("%d" , ans);        return 0;       }//COYG
原创粉丝点击