f[i][j]是时间顺序前i个垃圾,生命值为j时的最大高度
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 110, M = 3010;
int f[N][M];
int n;
struct Trash
{
int t, hea, hei;
bool operator<(const Trash &w)const {
return t < w.t;
}
}a[N];
int main()
{
int d;
scanf("%d%d", &d, &n);
for (int i = 1; i <= n; i++ ) {
int t, hea, hei;
scanf("%d%d%d", &t, &hea, &hei);
a[i] = {t, hea, hei};
}
sort(a + 1, a + n + 1);
f[0][10] = 0;
for (int i = 1; i <= n; i++ )
for (int j = 0; j <= M; j++ ) {
f[i][j] = f[i - 1][j + a[i].t - a[i - 1].t] + a[i].hei;
//第i个垃圾掉落的时候,生命为j,选择堆第i个垃圾,那么第i- 1个垃圾掉落的时候的生命应该为j加上两个垃圾掉落的时间差
if (j + a[i].t - a[i - 1].t - a[i].hea >= 0)
f[i][j] = max(f[i][j], f[i - 1][j + a[i].t - a[i - 1].t - a[i].hea]);
//选择吃的情况,第i-1个垃圾掉落时,生命应该是j减去第i个垃圾的生命,加上时间差
}
int res = 10000;
for (int i = 0; i <= n; i++ )
for (int j = 1; j < M; j++ )
if (f[i][j] >= d) {
res = a[i].t;
break;
}
if (res != 10000) { //出去的情况
cout << res << endl;
return 0;
}
res = 10;
int h = 10;
for (int i = 1; i <= n; i++ ) { //出不去的情况
if (a[i].t <= h) {
res += a[i].hea;
h = h - (a[i].t - a[i - 1].t) + a[i].hea;
}
}
cout << res << endl;
return 0;
}