题意
一头牛在一个深度为 D D D的坑里,有 G G G个垃圾在不同的时间落下,每个垃圾有高度和能量,奶牛可以选择吃掉或者堆起来,如果奶牛可以出坑,那么求最早出坑的时间,否则求能活到多久。
思路
类似背包的动态规划。
我们设
f
[
i
]
f[i]
f[i]为垃圾高度为
i
i
i时的最大生命值,然后就很好做了。
代码
#include<cstdio>
#include<algorithm>
struct node{
int t, v, h;
}a[101];
int D, G;
int f[101];
int cmp(node x, node y) {
return x.t < y.t;
}
int main() {
scanf("%d %d", &D, &G);
for (int i = 1; i <= G; i++)
scanf("%d %d %d", &a[i].t, &a[i].v, &a[i].h);
std::sort(a + 1, a + G + 1, cmp);//输入时间不一定按顺序
f[0] = 10;//初始高度为10
for (int i = 1; i <= G; i++) {
for (int j = D; j >= 0; j--) {
if (f[j] < a[i].t) continue;//不能吃到这个垃圾
if (j + a[i].h >= D) {
printf("%d", a[i].t);
return 0;
}
f[j + a[i].h] = std::max(f[j + a[i].h], f[j]);//堆
f[j] += a[i].v;//不堆
}
}
printf("%d", f[0]);
}