Computer Game
还算水的一道题。
题意
本题意为题面直接翻译的简化版,可能会比题目翻译要复杂。
有 \(q\) 次询问,每次给出四个数,表示一开始的电亮为 \(k\),有 \(n\) 个回合,不插电玩一个回合则电量会减少 \(a\),插电玩一个回合则电量会减少 \(b\),电量在任何时刻都必须 严格大于 \(0\)。
如果能玩完 \(n\) 个回合,输出不插电玩的回合数的最大值;否则输出 \(-1\)。
思路
由于 \(k\) 最大为 \(10^9\),直接模拟肯定是不行的。
那么,这题怎样做呢?
首先,电量消耗最少的方案是每回合都插电玩,一共消耗 \(n \times b\) 的电量,只有当 \(k\) 严格大于 它时才能玩完所有回合,否则就可以输出 \(-1\)。
如果在玩某一个回合时把电拔了,那么就要多用 \(a - b\) 的电量。
要保证能玩完所有回合,可以用来自由分配的电量就只有 \(k - n \times b - 1\),知道了这个,答案也可以很快地推出来了。
可以不插电玩的回合数的公式为:\(\frac{k - n \times b - 1}{a - b}\)。
由于总共只有 \(n\) 个回合,所以答案是不能超过 \(n\) 的,正确答案公式为 \(\min(\frac{k - n \times b - 1}{a - b}, n)\)。
时间复杂度:\(O(q)\),轻松过。
要开 long long
。
代码
#include <bits/stdc++.h>
using namespace std;
long long q, n, k, a, b;
int main() {
for (cin >> q; q; q--) {
cin >> k >> n >> a >> b;
if (k <= n * b) { // 玩都玩不完
cout << -1;
} else {
cout << min(n, (k - n * b - 1) / (a - b)); // 套上公式即可
}
cout << '\n';
}
return 0;
}
标签:题解,电量,long,times,回合,Game,Computer,电玩
From: https://www.cnblogs.com/lw0-blog/p/17409914.html