求助
查看原帖
求助
389844
XjascodoixjqoinOI楼主2021/4/25 22:52

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;
}
2021/4/25 22:52
加载中...