A - Archmage Gym - 102623A题解

题目链接
题目大意:一个法师,有能量上限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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值