洛谷 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);
}
posted @ 2019-07-15 19:55  xuyixuan  阅读(135)  评论(0编辑  收藏  举报