202009-1 称检测点查询 cpp版
样例输入1
3 2 2
2 2
2 3
2 4
样例输出1
1
2
3
样例输入2
5 0 1
-1 0
0 0
1 0
0 2
-1 2
样例输出2
2
4
1
这是一道非常简单的数学题,点与点之间的距离可直接用欧式距离的平方形式进行计算。
设计结构体node来保存每一个点。
每一个node包括自己的id,x坐标,y坐标,dis(与市民所在的距离)。
用algorithm库中的sort函数进行排序,sort函数的排序方式需要重新定义(函数使用方法可百度),排序后输出前三个node的id即可。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int x;
int y;
int id;
int dis;
}lis[201];//node 结构体定义
bool tmp(node m,node n){//自定义排序方式
if(m.dis<n.dis){
return true;
}else if(m.dis==n.dis){
if(m.id<n.id) return true;
}
return false;
}
int main(){
int n=0;
int xx=0,yy=0;
scanf("%d %d %d",&n,&xx,&yy);
for(int i=1;i<=n;i++){//node数组初始化
lis[i].id=i;
scanf("%d %d",&lis[i].x,&lis[i].y);
lis[i].dis=(lis[i].x-xx)*(lis[i].x-xx)+(lis[i].y-yy)*(lis[i].y-yy);
}
sort(lis+1,lis+n,tmp);//是从数组的1 号开始存,所以排序范围1-n
for(int i=1;i<=3;i++){
printf("%d\n",lis[i].id);
}
return 0;
}
这个是比较好理解的呀,cpp的stl很强大,掌握后写题省很多事!!!