题解:P15056 [UOI 2023 II Stage] Unenslaved puppy

· · 题解

P15056 题解

题意简述

给出一只狗和一窝蜜蜂的坐标和 n 个保护罩的圆心和坐标,求第一个使狗和蜜蜂隔开的保护罩编号。

思路

只要当一个保护罩能使狗和蜜蜂不在同一区域(不一定是狗被罩进去),则狗狗就安全了。

所以我们只需要在每个保护罩给出的时候判断狗和蜜蜂是否处于保护罩同侧即可。

还不理解?看代码。

代码实现

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,x,y,xx,yy;//用y2做变量会出现玄学(?)问题
bool pd(int p,int r,int ax,int ay){
    return (p-ax)*(p-ax)+ay*ay <= r*r;//判断(ax,ay)是否在保护罩内,通过比较距离的平方是为了避免出现精度问题
}
signed main(){
    scanf("%lld %lld %lld %lld %lld",&n,&x,&y,&xx,&yy);//读入
    for(int i=1;i<=n;i++){
        int p,r;
        scanf("%lld %lld",&p,&r);
        if(pd(p,r,x,y)!=pd(p,r,xx,yy)){//判断狗和蜜蜂是否都在这个保护罩的内部(或外部)
            printf("NO\n%lld\n",i);
            return 0;
        }
    }
    printf("YES\n");
    return (0^0);
}