洛谷 P1156 垃圾陷阱
题意简述
一头牛被困在垃圾井中,要通过垃圾来维持生命,或堆高来逃出垃圾井
有n个垃圾,知道扔下的时间,堆放的高度,维持生命的时间,求逃出井的时间或最长存活时间
题解思路
背包。
把垃圾的高度看成物重,维持生命的时间看成价值,把井的高度看成包的大小。
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
int d, g, ans = -1;
int dp[2][110];
struct Rub { int t, h, f; } r[110];
inline bool cmp(const Rub& x, const Rub& y) { return x.t < y.t; }
inline void mmax(int& x, const int& y) { if (y > x) x = y; }
int main()
{
scanf("%d%d", &d, &g);
for (int i = 1; i <= g; ++i) scanf("%d%d%d", &r[i].t, &r[i].f, &r[i].h);
std::sort(r + 1, r + g + 1, cmp);
memset(dp, ~0x3f, sizeof(dp));
dp[0][0] = 10;
for (register int i = 1; i <= g; ++i)
{
int t1 = i & 1, t2 = t1 ^ 1;
memset(dp[t1], ~0x3f, sizeof(dp[t1]));
for (register int j = d; j >= 0; --j)
if (dp[t2][j] >= (r[i].t - r[i - 1].t))
{
if ((j + r[i].h) >= d)
{
printf("%d\n", r[i].t);
return 0;
}
mmax(dp[t1][j + r[i].h], dp[t2][j] - r[i].t + r[i - 1].t);
mmax(dp[t1][j], dp[t2][j] + r[i].f - r[i].t + r[i - 1].t);
}
mmax(ans, dp[t1][0] + r[i].t);
}
printf("%d\n", ans);
}