题目:
代码:
第一版:
#include<bits/stdc++.h>
//^是异或运算符 不可以用x^2来表示平方
//本题有一个思想,使用排序后的距离来和,原顺序匹配 得到下标值
int main()
{
int n,X,Y;
int d=0;
int flag=0,dis=0;
scanf("%d %d %d",&n,&X,&Y);
int a[250],b[250];
int result[100];
int copy[400];
for(int i=0;i<n;i++)
{
scanf("%d %d",&a[i],&b[i]);
}
for(int i=0;i<n;i++)
{
dis=((X-a[i])*(X-a[i]))+((Y-b[i])*(Y-b[i]));
result[i]=dis;
copy[i]=dis;
}
int temp;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(result[i]>result[j])
{
temp=result[i];
result[i]=result[j];
result[j]=temp;
}
}
}
int j=0;
for(int i=0;i<3;i++)
{
for(j=0;j<n;j++)
{
if(result[i]==copy[j])
{
copy[j]=-2;//如果下一次还是同样的数字,如果不把对应
//的距离进行修改,则会再次输出该下标
break;
}
}
printf("%d\n",j+1);
}
return 0;
}
第二版:?
#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
int n,X,Y;
int a,b;
scanf("%d %d %d",&n,&X,&Y);
int dis[250];
int copy[250];
for(int i=0;i<n;i++)
{
scanf("%d %d",&a,&b);
dis[i]=(X-a)*(X-a)+(Y-b)*(Y-b);
}
for(int i=0;i<n;i++)
{
copy[i]=dis[i];
}
sort(copy,copy+n);
for(int i=0;i<3;i++)
{
for(int j=0;j<n;j++)
{
if(copy[i]==dis[j])
{
printf("%d\n",j+1);
dis[j]=-100;
break;
}
}
}
return 0;
}
本题解题关键在于如何将排序后的距离与之前的监测点进行匹配。我使用的是排序后的距离与未排序的距离进行对比,得到原来的坐标。
注意:①找到第一个满足条件的距离的下标之后结束本次循环,使用break。
? ? ? ? ? ?②为了避免出现前一次匹配的下标和第二次还是一样的,我们将第一次匹配成功的数组的值置为负数(距离不可能为负,故不可能再次匹配到)。
? ? ? ? ? ?③本题还需注意要求输出的是前三个距离最短的监测点,第一层循环为i<3,而不是i<n。
|