1032 挖掘机技术哪家强 (20 分)
为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。
输入格式:
输入在第 1 行给出不超过 105 的正整数 N,即参赛人数。随后 N 行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从 1 开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。
输出格式:
在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。
输入样例:
6
3 65
2 80
1 100
2 70
3 40
3 0
输出样例:
2 150
沃德天呐,这么简单的题都能错好几次。。。
思路分析:
这个题挺简单吧。。一个数组操作就完事了
开始来个超大数组;
然后n个循环输入,数组下标就是学校编号,数组元素就是学校成绩,直接+=操作就行(相同的的学校编号就直接加上到原来的上面去);
最后再来个循环遍历,比较选一个最大的,记一下下标就可以了。因为有n个,所以最多有n个学校(少几个也没差啦,就是多循环那么个几次),遍历n遍就是了
正确代码:
#include <stdio.h>
#include <stdlib.h>
int school[1000000]= {0};
int main()
{
int n,i,schoolId,schoolScore;
int maxSchool = 0;
school[0] = -1;
scanf("%d",&n);
for(i = 0; i < n; i++)
{
scanf("%d %d",&schoolId,&schoolScore);
school[schoolId] += schoolScore;
}
for(i = 0; i<=n; i++)
{
if(school[i]>school[maxSchool])
maxSchool = i;
}
printf("%d %d",maxSchool,school[maxSchool]);
return 0;
}
我的错误:
其一,超大数组,开始我定义的school[10000]。。。(喂你告诉我10^5是几?)所以说直接出现了段错误
最后一生气定义了1000000
另外:
数组如果比较大的话(大概10^6级别),这需要将其定义在主函数之外,否则会使程序异常退出,原因是函数内部申请的局部变量来自系统栈,允许申请的空间较小;而函数外部申请的全局变量来自于静态内存区,允许申请的空间较大。
——《算法笔记》
其二,其实还想使用动态数组,但是失败了
scanf("%d",&n);
int *school = (int*)malloc(sizeof(int)*n);
memset(school,0,sizeof(school));
直接两个运行时错误,一个段错误。。。这个目前没有找到解决方法
memset(数组名,0,sizeof(数组名) //将数组里面的元素初始化为0或-1
其三,还有要注意第二个循环处,共有n个数据,学校编号不是从0到n-1,而是从1到n;我开始写的for跳出条件 i < n,忽略了最后一个。
PS:今天看了《算法笔记》的C基础,算是复习了一遍,学到了不少东西,比如:
C语言中的数组,开始定义的时候,写 int a[10],这样里面的初始值是随机数;
如果定义的时候覆一个初值:int a[10] = {0} ,那么这10个元素就全部初始化为0
总结:还是粗心,小错误不断。以后要对数字敏感点,不能一看差不多大概少个0多个0的没关系。其次一定要分辨清数组的跳出条件。啊感觉写博客的思路好混乱啊。。。善于总结应该是个好习惯吧。明天继续看算法笔记。
挖掘机技术哪家强,中国山东找蓝翔!!!