题目

时间限制: 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排序是稳定排序吗?

代码

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespace std;
  5. struct didian{
  6. int index;
  7. long long s;
  8. };
  9. vector<didian> s;
  10. didian temp_didian;
  11. bool cmp(didian a,didian b){
  12. if(a.s==b.s){ //要注意当距离相等另外判断index大小,不然就会出错
  13. return a.index<b.index;
  14. }
  15. return a.s<b.s;
  16. }
  17. int main(){
  18. int n,x,y;
  19. int temp_x,temp_y;
  20. cin>>n>>x>>y;
  21. for(int i=1;i<=n;i++){
  22. cin>>temp_x>>temp_y;
  23. temp_didian.s =(x-temp_x)*(x-temp_x)+(y-temp_y)*(y-temp_y);
  24. temp_didian.index =i;
  25. s.push_back(temp_didian);
  26. }
  27. sort(s.begin(),s.end(),cmp);//从小到大排序
  28. // for(vector<didian>::iterator it =s.begin();it!=s.end();it++){
  29. // cout<<(*it).index<<endl;
  30. // }
  31. //
  32. cout<<s[0].index<<endl;
  33. cout<<s[1].index<<endl;
  34. cout<<s[2].index<<endl;
  35. return 0;
  36. }