1032 挖掘机技术哪家强 (20 分)
为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。
输入格式:
输入在第 1 行给出不超过 105 的正整数 N,即参赛人数。随后 N 行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从 1 开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。
输出格式:
在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。
输入样例:
6
3 65
2 80
1 100
2 70
3 40
3 0
输出样例:
2 150
思路
- 令数组school[maxn]记录每一个学校的总分,初值为0。对每一个读入的学校schId与其对应的分数score,令school[schId]+=score
- 令变量k记录最高总分的学校编号,变量MAX记录最高总分,初值为-1.由于学校是连续编号的,因此枚举1~N,不断更新k和MAX即可
我的代码
#include<stdio.h>
int main(){
int n, k = 1, MAX = -1;//用k记录最大总分的学校的编号
int school[100000]= {0};//记录每个学校的总分
int schId, score;
scanf("%d", &n);
//这段是我写错的,因为学号是从1开始的,所以这样的话可能前面没有问题,但时编号一大就会出现问题,一直部分错误
/*for(int i = 0; i < n; i++)*/
for(int i = 1; i <= n; i++){//但是就算这样写,投到c通道还是有部分错误,投c++通道是正确的
scanf("%d %d", &schId, &score);
school[schId] += score;//把相同学校编号的成员的分数相加记录总分
}
for(int i = 1; i <= n; i++){
if(school[i] >MAX){//把每个学校的总分和max比较,谁更大谁更新给max,找出最大值
k = i;
MAX = school[i];
}
}
printf("%d %d", k, MAX);
return 0;
}
示例输出时对的,但是有部分错误。改过了之后对了
参考代码
数组的定义与我的不一样,下面这样比较好。下次学习一下!
- 提前定义宏定义数组的最大值已经数组
- cstdio是将stdio.h的内容用C++头文件的形式表示出来。
cstdio 和 stdio.h是有差别的,并不是同样的文件
stdio.h是以往的C和C++的头文件,cstdio是标准C++(STL),且cstdio中的函数都是定义在一个名称空间std里面的,如果要调用这个名字空间的函数,必须得加std::或者在文件中声明using namespace std。 - 这个与循环的把每一个值和循环值比较的方法也很好,所以MAX的初始值要设为-1,因为最低值是0。学习!!学习!!
#include<cstdio>
const int maxn = 100010;
int school[maxn] = {0};
int main(){
int n, k = 1, MAX = -1;//用k记录最大总分的学校的编号
int schId, score;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d %d", &schId, &score);
school[schId] += score;//把相同学校编号的成员的分数相加记录总分
}
for(int i = 1; i <= n; i++){
if(school[i] >MAX){//把每个学校的总分和max比较,谁更大谁更新给max,找出最大值
k = i;
MAX = school[i];
}
}
printf("%d %d", k, MAX);
return 0;
}
注意:上面代码在测试是要传入c++通道才能运行成功