(PTA乙级C语言)1032挖掘机技术哪家强——粗心大意,数组长度

1032 挖掘机技术哪家强 (20 分)

为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。

输入格式:

输入在第 1 行给出不超过 10​5​​ 的正整数 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的没关系。其次一定要分辨清数组的跳出条件。啊感觉写博客的思路好混乱啊。。。善于总结应该是个好习惯吧。明天继续看算法笔记。

 

挖掘机技术哪家强,中国山东找蓝翔!!!

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务