称检测点查询 202009-1

题目

2020 年 6 月 8 日,国务院联防联控机制发布《关于加快推进新冠病毒核酸检测的实施意见》,提出对“密切接触者”等八类重点人群“应检尽检”,其他人群“愿检尽检”。
某市设有$n$个核酸检测点,编号从$1$到$n$,其中$i$号检测点的位置可以表示为一个平面整数坐标$(x_i, y_i)$。
为方便预约核酸检测,请根据市民所在位置$(X, Y)$,查询距其最近的三个检测点。
多个检测点距离相同时,编号较小的视为更近。

输入

输入共$n+1$行。
第一行包含用空格分隔的三个整数$n、X$和$Y$,表示检测点总数和市民所在位置。
第二行到第$n+1$行依次输入$n$个检测点的坐标。第$i+1$行$(1≤i≤n)$包含用空格分隔的两个整数$x_i$和$y_i$,表示$i$号检测点所在位置。

输出

输出共三行,按距离从近到远,依次输出距离该市民最近的三个检测点编号。

输入样例1

1
2
3
4
3 2 2
2 2
2 3
2 4

输出样例1

1
2
3
1
2
3

输入样例2

1
2
3
4
5
6
5 0 1
-1 0
0 0
1 0
0 2
-1 2

输出样例2

1
2
3
2
4
1

样例2解释:

解答(Dev-CPP环境)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct Point{
int id;
int dis;
Point(int id,int dis){
this->id=id;
this->dis=dis;
}
};

int calc(int X,int Y,int x,int y){
return (X-x)*(X-x)+(Y-y)*(Y-y);
}

bool cmp(Point p1,Point p2){
if(p1.dis==p2.dis){
return p1.id<p2.id;
}
return p1.dis<p2.dis;
}


int main(){
int n,X,Y,px,py,d;
vector<Point> points;
cin>>n>>X>>Y;
for(int i=0;i<n;i++){
cin>>px>>py;
d=calc(X,Y,px,py);
points.push_back(Point(i+1,d));
}
sort(points.begin(),points.end(),cmp);

for(int i=0;i<3;i++){
cout<<points[i].id<<endl;
}

return 0;
}