文章

68

粉丝

691

获赞

26

访问

578.4k

头像
搜素+剪枝
P1070
发布于2020年5月10日 19:19
阅读数 8.8k

 https://blog.csdn.net/csyifanZhang/article/details/106035134

↑ 完整题解

struct E {
	ll t, f, h;
}v[MAX];

bool cmp(E e1, E e2) { return e1.t < e2.t; }

ll D, G, maxAlive, minDepart;
ll exist[105][1000][105];//遍历到第i个垃圾,还能苟j小时,高度为k

//当前便利到第k个垃圾,能够活到sur,总高度height
void dfs(ll k, ll sur, ll height) {
	if (height >= D) {
		if (v[k - 1].t < minDepart)minDepart = v[k - 1].t; return;
	}
	if (k >= G) return;//没法出去
	if (sur < v[k].t)return;//活不到这个垃圾到的时候
	if (exist[k][sur][height])return;//重复状态
	exist[k][sur][height] = 1;
	//两种选择,吃了还是筑高
	dfs(k + 1, sur + v[k].f, height);//吃掉
	//铸造,此时消耗能量为与下一个垃圾的时间间隔,增高v[k].h
	dfs(k + 1, sur, height + v[k].h);
}

int main() {
	while (cin >> D >> G) {
		maxAlive = 10, minDepart = inf;
		memset(exist, 0, sizeof(exist));
		for (int i = 0; i < G; i++)
			cin >> v[i].t >> v[i].f >> v[i].h, maxAlive += v[i].f;
		sort(v, v + G, cmp);
		dfs(0, 10, 0);
		if (minDepart == inf)c...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发