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

· · 题解

题意分析

本题要求我们判断小狗是否不会被咬。将其抽象后得到题目核心为判断点与圆的位置关系。

做法介绍

我们使用两点间的距离公式来完成这个判断。

具体地,若两点横坐标差为 \Delta x,纵坐标差为 \Delta y,那么两点间的距离 d=\sqrt{\Delta x^ 2 + \Delta y^2}

求出点和圆心的距离,若 d > r,点在圆外部,否则在圆内。

为了方便计算,我们给不等式两侧平方,这样就不用开根了。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,x_1,y_1,x_2,y_2;
    cin>>n>>x_1>>y_1>>x_2>>y_2;
    for(int i=1;i<=n;i++){
        int pos,r;
        cin>>pos>>r;
        if((x_1-pos)*(x_1-pos)+(y_1*y_1)<=r*r && (x_2-pos)*(x_2-pos)+(y_2*y_2)>r*r ||\
          (x_1-pos)*(x_1-pos)+(y_1*y_1)>r*r && (x_2-pos)*(x_2-pos)+(y_2*y_2)<=r*r){
            cout<<"NO\n"<<i;
            return 0;
        }
    }
    cout<<"YES";
}