1 条题解
-
0
#include <bits/stdc++.h> using namespace std; // D 井的深度, G 垃圾数量 int D, G; struct Trash { // 落下的时间、能维持的生命、可以垫高的高度 int t, f, h; }; Trash a[105]; bool cmp(Trash a, Trash b) { return a.t < b.t; } int f[105][1000 + 5]; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> D >> G; for (int i = 1; i <= G; i++) cin >> a[i].t >> a[i].f >> a[i].h; sort(a + 1, a + G + 1, cmp); memset(f, -1, sizeof(f)); for (int i = 0; i <= 10; i++) f[0][i] = 0; for (int i = 0; i <= G - 1; i++) { for (int j = 0; j <= a[G].t; j++) { // 当前状态为前 i 个垃圾,生命为 j 时的状态 if (f[i][j] == -1) continue; // 加入下一个垃圾时能否修改状态 if (j < a[i + 1].t) f[i + 1][j] = f[i][j]; else { // 下一个垃圾是吃了还是垫高 // 垫高 f[i + 1][j] = max(f[i + 1][j], f[i][j] + a[i + 1].h); // 吃了(吃完后的高度不变,生命可以达到 j~j+a[i+1].f) for (int k = j; k <= min(j + a[i + 1].f, a[G].t); k++) f[i + 1][k] = max(f[i + 1][k], f[i][j]); } } } // 检查到第几个垃圾的时候能出去 int pos = G + 1; for (int i = 0; i <= G; i++) for (int j = 0; j <= a[G].t; j++) if (f[i][j] >= D) pos = min(pos, i); if (pos != G + 1) { cout << a[pos].t; return 0; } // 单独计算能活多久 int ans = 10; for (int i = 1; i <= G; i++) if (a[i].t <= ans) ans += a[i].f; cout << ans; return 0; }
- 1
信息
- ID
- 1744
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- 递交数
- 14
- 已通过
- 7
- 上传者