问题 A: 核酸检测点选择
题目描述
某市设有n个核酸检测点,编号从1到n,其中i号检测点的位置可以表示为一个平面整数坐标 (xi,yi)。为方便预约核酸检测,请根据市民所在位置(X,Y),查询距其最近的检测点。
多个检测点距离相同时,编号较小的视为更近。
输入
多组样例
输入共 n+1行。
第一行包含用空格分隔的三个整数n、X 和 Y,表示检测点总数和市民所在位置。
第二行到第 n+1 行依次输入 n 个检测点的坐标。第 i+1 行(1≤i≤n)包含用空格分隔的两个整数 xi 和 yi,表示 i 号检测点所在位置。
x和y均≤10000 ,n≤100
输出
输出共一行,输出距离该市民最近的检测点的编号,坐标,和距离。距离保留两位小数,用空格隔开
样例输入
3 0 0
3 4
5 12
8 15
样例输出
1 3 4 5.00
AC代码如下:
#include <stdio.h>
#include <math.h>
int main(void){
int i,a,b,n,t;
double d[101]={0.0};
//此处运用数组,便于后面输出结果
int x[101]={0};
int y[101]={0};
//x就是横坐标,y就是纵坐标
double m;
//这个地方为了储存第一个d,方便后续比较各组数据的大小
while(~scanf("%d %d %d",&n,&a,&b)){
for(i=1;i<=n;i++){
scanf("%d %d",&x[i],&y[i]);
//储存每个xi,yi
x[i]=x[i]-a,y[i]=y[i]-b;
//先减去市民所在位置的横纵坐标
d[i]=x[i]*x[i]+y[i]*y[i];
d[i]=sqrt(d[i]);
//算出di
}
m=d[1];
t=1;
//这个地方让m=d1,t=1,方便后续比较大小
for(i=1;i<=n;i++){
if(d[i]<m){
m=d[i];
t=i;
}
}
//找出最短距离,并把其下标赋给t,方便输出
printf("%d %d %d %.2f\n",t,x[t]+a,y[t]+b,d[t]);
//输出最近的检测点的编号,坐标和距离,记住在前面已经减去了市民所在位置的横纵坐标
}
return 0;
}
仅供参考,不希望同学们拿来完成任务