题目
时间限制: 1.0s 内存限制: 256.0MB 题目背景 2020 年 6 月 8 日,国务院联防联控机制发布《关于加快推进新冠病毒核酸检测的实施意见》,提出对“密切接触者”等八类重点人群“应检尽检”,其他人群“愿检尽检”。 问题描述 某市设有 n 个核酸检测点,编号从 1 到 n,其中 i 号检测点的位置可以表示为一个平面整数坐标(xi, yi)。 为方便预约核酸检测,请根据市民所在位置(x, y) ,查询距其最近的三个检测点。 多个检测点距离相同时,编号较小的视为更近。 输入格式 输入共 n + 1 行。 第一行包含用空格分隔的三个整数 n、x 和 y,表示检测点总数和市民所在位置。 第二行到第 n + 1 行依次输入 n 个检测点的坐标。第 i + 1 行(1<= i <= n)包含用空格分隔的两个整数 xi 和 yi ,表示 i 号检测点所在位置。 输出格式 输出共三行,按距离从近到远,依次输出距离该市民最近的三个检测点编号。 样例输入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 样例2解释 … 评测用例规模与约定 全部的测试点满足,3<=n<=200,所有坐标均为整数且绝对值不超过1000 。 提示 市民到第 i 号检测点的距离 Di 可由如下公式算出: Di2 = (x - xi)2+(y - yi)2 |
---|
思路
大佬分析
采用局部排序就可以了,数组也省了,计算速度应该也是快的。算出所有距离再排序也可以,时间空间都不是好的。
因为所有坐标均为整数且绝对值不超过1000,所以开方也可以省去,平方和当作距离进行比较就可以了,计算速度更快。
我的踩坑
因为我直接用了sort函数,所以坑在于sort的使用tips上,sort排序是不稳定的(三种排序的混合应用),遇到相同元素时根据数据量的大小可能出现不同情况。可以参考文章: STL中的sort排序是稳定排序吗?
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct didian{
int index;
long long s;
};
vector<didian> s;
didian temp_didian;
bool cmp(didian a,didian b){
if(a.s==b.s){ //要注意当距离相等另外判断index大小,不然就会出错
return a.index<b.index;
}
return a.s<b.s;
}
int main(){
int n,x,y;
int temp_x,temp_y;
cin>>n>>x>>y;
for(int i=1;i<=n;i++){
cin>>temp_x>>temp_y;
temp_didian.s =(x-temp_x)*(x-temp_x)+(y-temp_y)*(y-temp_y);
temp_didian.index =i;
s.push_back(temp_didian);
}
sort(s.begin(),s.end(),cmp);//从小到大排序
// for(vector<didian>::iterator it =s.begin();it!=s.end();it++){
// cout<<(*it).index<<endl;
// }
//
cout<<s[0].index<<endl;
cout<<s[1].index<<endl;
cout<<s[2].index<<endl;
return 0;
}