璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


icpc:problems:incinerate
problems
名称Incinerate
题目编号840B
题目链接codeforces.com/…
来源CodeForces
算法分类RMQ, 思维, 排序, 模拟
难易程度容易

Incinerate

想法

基本上是模拟整个过程,首先按照生命值排序,然后从后往前枚举,如果k + 以前扣除的量 > 当前值,那就需要停下来作为1次整体攻击。

代码实现

#include<cstdio>
#include<cstring>
#include<algorithm>
 
const int N = 100010;
int n, k, mi[N];
struct monster{
	int h, p;
	friend bool operator<(const monster a, const monster b) {
		return a.h > b.h || (a.h == b.h && a.p > b.p);
	}
};
monster line[N];
 
int main()
{
	int T;
	scanf("%d", &T);
	for (int t = 0; t < T; ++t) {
		memset(mi, 0, sizeof(mi));
		memset(line, 0, sizeof(line));
		scanf("%d %d", &n, &k);
		for (int i = 0; i < n; ++i) {
			scanf("%d", &line[i].h);
		}
		for (int i = 0; i < n; ++i) {
			scanf("%d", &line[i].p);
		}
 
		std::sort(line, line+n);
 
		mi[0] = line[0].p;
		for (int i = 1; i < n; ++i) {
			mi[i] = mi[i-1] > line[i].p ? line[i].p : mi[i-1];
		}
 
		int before = 0;
		for (int i = n-1; i >= 0; --i) {
			while(line[i].h - before > k && k >= 0)
			{
				before += k;
				k -= mi[i];
			}
			if(k < 0)
				break;
		}
		if(line[1].h <= before + k && k >= 0)
			printf("YES\n");
		else
			printf("NO\n");
	}
 
	return 0;
}
/app/www/public/data/pages/icpc/problems/incinerate.txt · 最后更改: 2023/09/30 07:27 由 温婕莺