题解:P12974 蒸蒸日上

· · 题解

三国杀坏事做尽。

题目大意

一个长度为 n 的环中有两个人,给出他们的位置、攻击距离和坐骑(增加对方到自己的距离或者减少自己到对方的距离)。问这两个人互相是否能攻击到对方。

具体思路

为了方便,我们将两个人称为 ab,两个人的位置为 axbx

首先我们把攻击距离和坐骑扔到一边,在只考虑位置的情况下算出他们的距离。

题目中提到,距离为两个玩家之间顺时针或逆时针相隔的人数最小值加上 1。其实就是 \lvert bx-ax \rvertn - (\lvert bx-ax \rvert) 中的最小值。

算出距离后,只需要按照坐骑算出实际距离之后判断距离是否超过武器距离即可。

完整代码

于是乎,我们来到了大家最喜爱的代码环节。

#include<bits/stdc++.h>
#define int long long 
using namespace std;
struct man{
    int x;//位置 
    int l;//攻击距离 
    string w;//坐骑 
};
signed main(){
    int n;
    cin>>n;
    man a,b;
    int x,y;//为了方便计算,这里我用了两个变量分别表示a到b和b到a的实际距离。 
    cin>>a.x>>a.l>>a.w>>b.x>>b.l>>b.w;
    x=y=min(abs(b.x-a.x),n-abs(b.x-a.x));//两人初始距离相等。
    //计算坐骑 
    if(a.w=="+1")y++;
    if(b.w=="+1")x++;
    if(a.w=="-1")x--;
    if(b.w=="-1")y--;
    //判断距离 
    if(a.l>=x)cout<<"Yes\n";
    else cout<<"No\n";
    if(b.l>=y)cout<<"Yes\n";
    else cout<<"No\n";
    return 0;//好习惯 
}