假设卡门预先知道了每个垃圾扔下的时间$t (0 < t \le 1000)$,以及每个垃圾堆放的高度$h(1 \le h \le 25$)和吃进该垃圾能维持生命的时间$f(1 \le f \le 30)$,要求出卡门最早能逃出井外的时间,假设卡门当前体内有足够持续$10$小时的能量,如果卡门$10$小时内没有进食,卡门就将饿死。
#include<algorithm> #include<cstring> #include<cstdio> #include<vector> #include<cctype> #include<cmath> #include<unordered_map> #define ll long long #define ri register int
char buf[1 << 20], *p1, *p2; //#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2)?EOF: *p1++) template <typename T> inlinevoidread(T &t){ ri v = getchar();T f = 1;t = 0; while (!isdigit(v)) {if (v == '-')f = -1;v = getchar();} while (isdigit(v)) {t = t * 10 + v - 48;v = getchar();} t *= f; } template <typename T,typename... Args> inlinevoidread(T &t,Args&... args){ read(t);read(args...); }
template <typename T> inline T min(T x,T y){return x<y?x:y;} template <typename T> inline T max(T x,T y){return x>y?x:y;} constint INF = 0x3f3f3f3f; const ll inf = 0x3f3f3f3f3f3f3f3fLL; constint N = 2010; int f[N][N],n,m; structnode { int t,f,h; friendinlinebooloperator < (const node &a,const node &b) { return a.t < b.t; } }a[N]; bool flag; intmain(){ read(m,n); for (int i = 1;i <= n;++i) { read(a[i].t,a[i].f,a[i].h); } std::sort(a+1,a+1+n); memset(f,0xcf,sizeof f); f[0][0] = 10; for (int i = 1;i <= n;++i) { if (flag) break; for (int j = 0;j <= m;++j) { if (f[i-1][j] - (a[i].t - a[i-1].t) >= 0) { if (j + a[i].h >= m) { printf("%d",a[i].t); flag = 1;break; } f[i][j] = max(f[i][j],f[i-1][j] - (a[i].t - a[i-1].t) + a[i].f); f[i][j+a[i].h] = max(f[i][j+a[i].h],f[i-1][j] - (a[i].t - a[i-1].t)); } } } int ans = 0,now = 10; if (!flag) { for (int i = 1;i <= n;++i) { if (now < (a[i].t - a[i-1].t)) { printf("%d",now+ans); return0; } ans += (a[i].t - a[i-1].t); now = now - (a[i].t - a[i-1].t) + a[i].f; } printf("%d",now +ans); } return0; }