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

· · 题解

对于每个防护罩,我们会发现如果蜜蜂和狗一个在它里面,一个在它外面,那这个保护罩就是起到效果的。

怎么算他在不在保护罩里面呢?对比欧几里得距离和保护罩半径即可。

因此我们去找第一个起到保护效果的保护罩,能找到就输出不可以并结束程序,找不到就在最后输出可以。

代码如下:

#include<bits/stdc++.h>
using namespace std;
double jl(int xa,int ya,int xb,int yb){
    return sqrt((xb-xa)*(xb-xa)+(yb-ya)*(yb-ya));
}
int main(){
    int n,x1,y1,x2,y2;
    cin>>n>>x1>>y1>>x2>>y2;
    for(int i=1;i<=n;i++){
        int p,r;
        cin>>p>>r;
        double jx=jl(p,0,x1,y1),jy=jl(p,0,x2,y2);
        if((jx<=r)!=(jy<r)){//注意蜜蜂在保护罩上保护罩是可以保护到蜜蜂的。
            cout<<"NO"<<endl;
            cout<<i<<endl;
            return 0;
        }
    }
    cout<<"YES"<<endl;
    return 0;
}