Kill the Monster(枚举)

题目
题意:给定角色的生命值hc, 攻击值dc,怪兽的生命值hm,攻击值dm。角色和怪兽轮流互相攻击,角色先攻击。每次角色对怪兽的攻击,怪兽生命值减dc;每次怪兽对角色的攻击,角色的生命值减dm。如果一方的生命值减为0或负数,则另一方胜利。
现在有k枚硬币,每枚硬币,可以选择给角色增加w的攻击值,或者增加a的生命值。
问利用这k枚硬币,角色能否取胜。

思路:角色赢怪兽,本质就是角色挂掉需要被锤的次数要大于等于怪兽挂掉需要被锤的次数。
( h c + d m − 1 ) / d m > = ( h m + d c − 1 ) / d c (hc + dm - 1) / dm >= (hm + dc -1) / dc (hc+dm1)/dm>=(hm+dc1)/dc
( h c + d m − 1 ) ∗ d c > = ( h m + d c − 1 ) ∗ d m (hc + dm - 1) * dc >= (hm + dc -1) * dm (hc+dm1)dc>=(hm+dc1)dm
( h c − 1 ) ∗ d c > = ( h m − 1 ) ∗ d m (hc - 1) * dc >= (hm - 1) * dm (hc1)dc>=(hm1)dm h c = h c − 1 , h m = h m − 1 hc=hc-1,hm=hm-1 hc=hc1,hm=hm1,有
h c ∗ d c > = h m ∗ d m hc * dc >= hm * dm hcdc>=hmdm,为防爆long long,转化为除法
h c / d m > = h m / d c hc / dm >= hm / dc hc/dm>=hm/dc

我们枚举k枚硬币的分配情况,找到其中一种 h c , d c hc,dc hc,dc,能满足 h c / d m > = h m / d c hc / dm >= hm / dc hc/dm>=hm/dc即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 200010;

ll hc, dc, hm, dm;
ll k, w, a;
void solve() {
	scanf("%lld%lld%lld%lld", &hc, &dc, &hm, &dm);
	scanf("%lld%lld%lld", &k, &w, &a);
	
	--hc;
	--hm;
	
	bool flag = false;
	for (ll i = 0; i <= k; ++i) {
		ll new_hc = hc + i * a;
		ll new_dc = dc + (k - i) * w;
		if (new_hc / dm >= hm / new_dc) {
			flag = true;
			break;
		}
	}
	printf("%s\n", flag ? "YES" : "NO");
	
}
int main()  {
	int t;
	scanf("%d", &t);
	while(t--) {
		solve();
	} 
	return 0;
}
/*
(hc + dm - 1) / dm >= (hm + dc -1) / dc

(hc + dm - 1) * dc >= (hm + dc -1) * dm

(hc - 1) * dc >= (hm - 1) * dm

hc * dc >= hm * dm

hc / dm >= hm / dc


*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值