题解 P6462 【补刀】

· · 题解

首先纠正题目里的问题: 输出格式部分

输出 T 行。对于每组数据,如果可以最后将小兵击杀,输出 Yes,否则输出 No.。显然无法击杀输出 No 而非 No.

(我因为过分严谨而爆零。。。)

题目大意

小兵有 h 点的生命值。每次防御塔的攻击可以给小兵造成 x 点伤害,而你的英雄每次攻击可以给小兵造成 y 点伤害。你的攻击速度和防御塔攻击速度相同,所以你可以在防御塔第一次攻击小兵之前,或者每次防御塔攻击之后,选择是否对小兵进行一次攻击,当然你也可以选择不攻击。若能抢到人头输出 Yes,否则输出 No

大体思路

第一步:特判

先来看本题的数据范围:数据的组数不多于 501\le h \le 10^{18}0\le x,y \le 10^{18}。题目将 hx,y 分开标注,因为设置了一个坑点: x,y 有可能等于零

有四种特殊情况是需要判断的:

代码如下:

    if(y==0){//英雄没伤害
        cout<<"No\n";
        continue;
    }else if(x==0){//塔没伤害
        cout<<"Yes\n";
        continue;
    }
    else if(y>=h){//英雄一击毙命
        cout<<"Yes\n";
        continue;
    }
    else if(x>=h){//塔一击毙命但英雄不能
        cout<<"No\n";
        continue;
    }

注意这四种情况的位置不能颠倒,有可能塔和英雄伤害均为零,输出 No;塔和英雄均能一击毙命,输出Yes

第二步:剩余情况

剩下来的情况就是生命值被塔打的差不多,英雄再去抢。如果剩下来的生命值比 塔的攻击次数 \times 英雄的攻击力小,则能抢到。

代码如下:

    int t=h/x+1;//记录攻击次数
    h%=x;//剩下来的生命值
    h=(h==0?x:h);
    //如果生命值为零则加上x,
    //相当于回到塔击杀的前一次
    cout<<(t*y>=h?"Yes\n":"No\n");
    //判断能否击杀(三目运算符)

完整代码:

#include<bits/stdc++.h>//头文件
using namespace std;
#define int long long//记得开longlong
signed main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        int h,x,y;
        cin>>h>>x>>y;//输入
        if(y==0){
            cout<<"No\n";
            continue;
        }else if(x==0){
            cout<<"Yes\n";
            continue;
        }
        else if(y>=h){
            cout<<"Yes\n";
            continue;
        }
        else if(x>=h){
            cout<<"No\n";
            continue;
        }//特判
        int t=h/x+1;
        h%=x;
        h=(h==0?x:h);
        cout<<(t*y>=h?"Yes\n":"No\n");
        //计算
    }
    return 0;
}

看得这么认真,不点个赞再走嘛QWQ