**题意:**你和你的对手轮流打怪,你的伤害点为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;
}