题目
题意:给定角色的生命值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+dm−1)/dm>=(hm+dc−1)/dc即
(
h
c
+
d
m
−
1
)
∗
d
c
>
=
(
h
m
+
d
c
−
1
)
∗
d
m
(hc + dm - 1) * dc >= (hm + dc -1) * dm
(hc+dm−1)∗dc>=(hm+dc−1)∗dm即
(
h
c
−
1
)
∗
d
c
>
=
(
h
m
−
1
)
∗
d
m
(hc - 1) * dc >= (hm - 1) * dm
(hc−1)∗dc>=(hm−1)∗dm令
h
c
=
h
c
−
1
,
h
m
=
h
m
−
1
hc=hc-1,hm=hm-1
hc=hc−1,hm=hm−1,有
h
c
∗
d
c
>
=
h
m
∗
d
m
hc * dc >= hm * dm
hc∗dc>=hm∗dm,为防爆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
*/