用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