PAT乙级 射击比赛

问题描述:
本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军;谁差得最远,谁就是菜鸟。本题给出一系列弹洞的平面坐标(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:我只是手滑删掉了第一次写的文章,为什么不能恢复啊?啊啊啊~!

猜你喜欢

转载自blog.csdn.net/yft1023/article/details/84311737
今日推荐