问题描述:
本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军;谁差得最远,谁就是菜鸟。本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟。我们假设靶心在原点(0,0)。
输入格式:
输入在第一行中给出一个正整数 N(≤ 10 000)。随后 N 行,每行按下列格式给出:
ID x y
其中 ID 是运动员的编号(由 4 位数字组成);x 和 y 是其打出的弹洞的平面坐标(x,y),均为整数,且 0 ≤ |x|, |y| ≤ 100。题目保证每个运动员的编号不重复,且每人只打 1 枪。
输出格式:
输出冠军和菜鸟的编号,中间空 1 格。题目保证他们是唯一的。
输入样例:
3
0001 5 7
1020 -1 3
0233 0 -1
输出样例:
0233 0001
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
#define MaxSize 10000
class Point{
public:
int ID;
int x;
int y;
double distance;
Point(){}
Point(int p_ID,int p_x,int p_y)
{
ID=p_ID;
x=p_x;
y=p_y;
distance=sqrt(x*x+y*y);
}
};
int main()
{
int n;
cin>>n;
int ID,x,y;
int i,count=0;
Point *p[MaxSize];
int maxi=0,mini=0;
double dist[MaxSize];
for(i=0;i<n;i++)
{
cin>>ID>>x>>y;
p[count++]=new Point(ID,x,y);
dist[i]=p[i]->distance;
}
int max=dist[0];
int min=dist[0];
for(i=0;i<count;i++)
{
if(dist[i]>max)
{
max=dist[i];
maxi=i;
}
if(dist[i]<min)
{
min=dist[i];
mini=i;
}
}
printf("%04d",p[mini]->ID);
printf(" ");
printf("%04d",p[maxi]->ID);
getchar();
return 0;
}
这道题真是费了我不少功夫,主要原因还是审题不仔细。刚开始没想建一个类,感觉这道题和编程团体赛差不多,就想着利用循环来做,后来发现比较distance好比较但找不到对应的ID;觉得这类题和在学C++时老师出的练习题差不多,于是就建立了一个类;本来是想把distance作为一个函数的返回值,后来觉得太麻烦了,就把它作为类的变量成员了;还有就是最重要的一点就是不应该图省事,在比较大小时只记住了下标而没有把max替换掉。
int max=dist[0];
int min=dist[0];
for(i=0;i<count;i++)
{
if(dist[i]>max)
maxi=i;
if(dist[i]<min)
mini=i;
}
这是错误的。
int max=dist[0];
int min=dist[0];
for(i=0;i<count;i++)
{
if(dist[i]>max)
{
max=dist[i];
maxi=i;
}
if(dist[i]<min)
{
min=dist[i];
mini=i;
}
}
这个才是正确的。
总而言之,(1)要认真审题,看清题目要求输出什么;
(2)不能图省事,不要轻易忽略代码。
PS:我只是手滑删掉了第一次写的文章,为什么不能恢复啊?啊啊啊~!