补刀

题目链接

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");
        }    
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-21 22:29
点赞 评论 收藏
分享
12-09 12:21
门头沟学院 C++
l11hy:今早刚开,已满足
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务