题目描述
为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。
输入描述:
输入在第1行给出不超过105的正整数N,即参赛人数。随后N行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从1开始
连续编号)、及其比赛成绩(百分制),中间以空格分隔。
输出描述:
在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。
6
3 65
2 80
1 100
2 70
3 40
3 0
输出样例:
2 150
刚拿到这一题的时候,第一种想法是采用一个二维数组,一维存放学校编号,一维存放学校的分数,然后用for循环,来找到相同编号的学校,并将他们的分数相加,最后输出总分最高的xue'x以及它的得分,但是我并没有这么实现,觉得很繁琐,我的实现思路参考算法笔记上的思路,中间有一点细节处不一样(算法笔记上的代码可以通过上面的样例,但是对于极端的样例,如输入中含有100000 100,这样的学校编号很大的便不能通过测试)
具体的实现思路就是,设置了一个一维数组,school[100010]={0},这里将数组的大小设置为100010因为题目中要求学校编号不超过10^5,为了以防万一,这个大小定位100010,然后将学校的编号schID作为索引来存放分数和,即school[schID]+=score,这样输入结束,数组中对应学校编号的位置存放的就是这个学校了总得分,而索引位置就是学校的编号
具体代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int maxn = 100010;
int main()
{
int i,n,schID,score;
int school[maxn]={0};
int ma=0;//记录最大学校编号的位置
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&schID,&score);
school[schID]+=score;
if(schID>ma)
ma=schID;
}
int MAX=-1;
int temp;
for(i=1;i<=ma;i++)
if(school[i]>MAX)
{
MAX=school[i];
temp=i;
}
printf("%d %d",temp,MAX);
return 0;
}
在我的代码中多加了记录学校编号的最大值,这样保证可以访问到所有数据,才得以通过所有的测试点。