题解 P6462 【补刀】
Mars_Dingdang · · 题解
首先纠正题目里的问题: 输出格式部分
输出 Yes,否则输出 No.。显然无法击杀输出 No 而非 No.。
(我因为过分严谨而爆零。。。)
题目大意
小兵有 Yes,否则输出 No。
大体思路
第一步:特判
先来看本题的数据范围:数据的组数不多于
有四种特殊情况是需要判断的:
-
若英雄攻击力为零
(搞笑吗),显然无法干掉小兵,输出No。 -
若英雄攻击力不为零且塔的攻击力为零
(还是在搞笑啊),则英雄一定能干掉小兵(这不算补刀吧QWQ),输出Yes。 -
接下来判断:如果英雄直接能把小兵带走,显然可以。
-
若英雄不能一击毙命,但塔可以,显然抢不到。
代码如下:
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。
第二步:剩余情况
剩下来的情况就是生命值被塔打的差不多,英雄再去抢。如果剩下来的生命值比 塔的攻击次数
代码如下:
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