题目链接
题目大意:一个法师,有能量上限n,每回合可以花费x(如果有大于x的能量)的能量召唤一个水元素,每回合结束都会补充y的能量,但是最多就补到上限n,现在给出回合数,求他最多能召唤出多少水元素(一开始能量为n)
题目分析:很容易看出贪心策略,即每回合如果能召唤水元素就召唤。但是如果单纯模拟会超时,所以要找到O(1)的解法。
如果y大于等于x,那么每回合都可以召唤出水元素,答案就是回合数
否则,题目中有个很好的性质n > x + y,如果当前回合可以召唤水元素,那么我花费x召唤水元素,再补充y的能量,由于x > y所以补充能量后一定回比原来少,一定不会超能量上限。如果当前回合不可以召唤水元素,那么此时剩余能量cur < x,所以cur + y < x + y < n,故此时也不会超能量上限。所以每回合补充能量都不会被浪费,于是最终答案就是min(回合数,y * (回合数 - 1)/ x)。
代码:
#include <iostream>
using namespace std;
typedef long long ll;
ll T, n, m, x, y;
int main() {
cin >> T;
while (T--) {
cin >> n >> m >> x >> y;
if (y >= x) {cout << m << endl; continue;}
cout << min(m, (n + (m - 1) * y) / x) << endl;
}
return 0;
}