题目
题目可以在CSP观望中看到哟!
算法分析
这道题是一道关于排序的题目,题目给出了市民坐在位置的坐标,要在n个监测点中寻找到最近的三个监测点,并输出其三个的编号。排序的时候,如果距离一样,则编号小的排在前面(这就是排序条件)。
首先,按照距离由小到大进行排序,距离一样的话,按照编号从小到大排序。利用sort快速排序即可,可以自定义它的排序条件,代码如下。
完整代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#pragma warning (disable:4996)
using namespace std;
int n, X, Y;
int x[1000], y[1000];
struct Point
{
int num;
double dis;
}point[1000];
bool cmp(Point a, Point b)
{
if (a.dis != b.dis) return a.dis < b.dis;
else return a.num < b.num;
}
int main()
{
freopen("in.in", "r", stdin);
freopen("out.out", "w", stdout);
int i, j;
cin >> n >> X >> Y;
for (i = 1; i <= n; i++)
cin >> x[i] >> y[i];
for (i = 1; i <= n; i++)
{
point[i].num = i;
point[i].dis = sqrt((x[i] - X) * (x[i] - X) + (y[i] - Y) * (y[i] - Y));
}
sort(point + 1, point + n + 1, cmp);
for (i = 1; i <= 3; i++)
{
cout << point[i].num;
if (i != 3) cout << endl;
}
return 0;
}