CF1296D Fight with Monsters

**题意:**你和你的对手轮流打怪,你的伤害点为a,你的对手的伤害点为b,当你把怪我打死时,你可以获得一个点数,若你的对手打死则什么都没有。你有一个技能,总共能使用k次,让你的对手跳过他打怪的机会,让你打。要求你最多可以获得多少点数,即可以打死多少只怪(当怪的血量小于等于0时,为打死)。

**思路:**首先枚举出你要打死这只怪需要使用多少次技能,然后按照使用技能的次数从小到大排序。最后进行计算即可。具体细节在代码注释中。

code:

#include<bits/stdc++.h>
using namespace std;
int main() {
	long long n, a, b, k;
	cin >> n >> a >> b >> k;
	vector<long long > v;
	int i, num;
	for (i = 0; i < n; i++) {
		cin >> num;
		v.push_back(num);
	}
	long long tol = a + b;
	int ans = 0;
	vector<pair<int, long long> >v1;
	for (i = 0; i < n; i++) {
		long long mod = v[i] % tol; //当再次轮到你打怪时,怪的血量还剩多少。
		if (mod == 0) { //为0,则你的对手刚好把怪打死。
			if (a >= b ) { //如果你的输出大于你的对手,则你只需要使用一次技能
				v1.push_back(1);
			}
			else {
				int cnt = b / a + ((b % a) != 0); //计算你把怪打死还要多少次,也是需要使用技能的次数
				v1.push_back(cnt);
			}
		}
		else {
			if (a >= mod) { //直接把怪打死,无需使用技能。
				v1.push_back(0);
			}
			else {
				int cnt = mod / a + ((mod % a) != 0) - 1; //计算你把怪打死还要多少次,然后-1就是你要使用技能的次数,因为原本就轮到你。
				if (cnt < 0)
					cnt = 0;
				v1.push_back(cnt);	
			}
		}
	}

	v1.push_back(INT_MAX);
	sort(v1.begin(), v1.end());
	for (i = 1; i < v1.size(); i++) {
		v1[i] += v1[i - 1]; //求前缀和
	}
	ans = upper_bound(v1.begin(), v1.end(), k) - v1.begin(); 

	cout << ans << endl;
	return 0;
}
发布了50 篇原创文章 · 获赞 52 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_43058685/article/details/104177148