题目链接
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"); } } }