题目链接
https://www.dotcpp.com/oj/problem2318.html
解题思路
大佬解题思路:
因为我还是不知道如何证明,所以只能理解为,防御塔打的次数多了,人可能打的次数才多,造成的伤害才高,才有可能补到;并且,人补5刀是补,补1刀也是补,只要求输出能与否,所以我们可以让防御塔尽可能多打伤害,自己补个刀就行。
我的思路:
暴力(并非纯暴力)从防御塔最少打的次数遍历到最多打的次数,判断一下小兵剩余血量要挨英雄打几下,要是英雄攻击次数小于等于防御塔攻击次数+1,那么说明可以补刀,反之继续遍历,若全不行,则真不行。
最重要的一点是特判!!!没有特判直接死掉,而且特判少一个都不行,顺序倒一下也不行。
大佬AC代码
//大佬代码(难tai以qiang理le解ba)
#include<bits/stdc++.h>
using namespace std;
#define NO {printf("No\n");continue;}
#define YES {printf("Yes\n");continue; }
int main() {
long long h,x,y,t;
cin >> t;
while(t--) {
scanf("%lld%lld%lld",&h,&x,&y);
if(y >= h)YES//1.
if(x >= h)NO//2.
if(y == 0)NO//3.
if(x == 0)YES//4.
long long ti = h/x + 1;//英雄能攻击的次数
h = h % x;//剩余血
if(h == 0)h = x,ti--;//如果打没血了,就少打一次
if((ti) * y >= h)YES//英雄能造成总伤害比剩余血多,就能打死
else NO
}
}
我的AC代码
//我的代码(朴cai实de无yi华pi)
#include<bits/stdc++.h>
#define ll long long
#define sc(x) scanf("%lld",&x)
using namespace std;
int T;
ll h,x,y;
int main(){
sc(T);
while(T--){
int flag=0;
sc(h);sc(x);sc(y);
if(y==0) puts("No");
else if(x==0) puts("Yes");
else if(h<=y) puts("Yes");
else if(h<=x) puts("No");
else {
ll p1=h/(x+y),p2=h/x+1;
for(ll i=p1;i<=p2;i++){
ll tahurt=i*x;
ll rest=h-tahurt;
if(rest<=0) break;
if((rest/y+(rest%y==0?0:1))<=i+1) {
puts("Yes");
flag=1;
break;
}
}
if(!flag) puts("No");
}
}
}
京公网安备 11010502036488号