PAT 乙级 统计同成绩学生
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT 乙级 统计同成绩学生相关的知识,希望对你有一定的参考价值。
题目描述
本题要求读入N名学生的成绩,将获得某一给定分数的学生人数输出。
输入描述:
输入在第1行给出不超过10
5
的正整数N,即学生总人数。随后1行给出N名学生的百分制整数成绩,中间以空格分隔。最后1行给出要查询的分
数个数K(不超过N的正整数),随后是K个分数,中间以空格分隔。
输出描述:
在一行中按查询顺序给出得分等于指定分数的学生人数,中间以空格分隔,但行末不得有多余空格。
输入例子:
10
60 75 90 55 75 99 82 90 75 50
3 75 90 88
输出例子:
3 2 0
scanf("%d", &count); int search[count] = {0}, people[count] = {0};
第一版代码出现编译错误“ error: variable-sized object may not be initialized int search[count] = {0}, people[count] = {0}; ”,数组定义时不能用变量作为数组长度,即只能定义定长数组。
#include<stdio.h> #include<stdlib.h> const int maxn = 100; int main(){ int N, count, search; int notFirst = 0; int grades[maxn] = {0}; scanf("%d", &N); for(int i = 0; i < N; i++){ scanf("%d", &grades[i]); } scanf("%d", &count); while(scanf("%d", &search)){ int n = 0; for(int i = 0; i < sizeof(grades); i++){ if(search == grades[i]) n++; } if(notFirst) printf(" "); printf("%d", n); notFirst++; } return 0; }
第二版代码,很不幸超时了,解题思路不太正确,对于较少的数据量,以上方法还可以有很好的性能。但对于大量的输入成绩,查询每个成绩都要把grades数组遍历一遍,性能太差。
改进方法:将grades数组改造成长度为100的数组,每个位置分别代表0-100各个分数出现的次数。查询成绩时只需输出对应数字即可,例:78,输出grades[77]。
#include<stdio.h> const int maxn = 101; int main(){ int grades[maxn] = {0}; int n = 0, times = 0, notFirst = 0; scanf("%d", &n); for(int i = 0; i < n; i++){ int grade = 0; scanf("%d", &grade); grades[grade]++; } scanf("%d", ×); for(int i = 0; i < times; i++){ int search = 0; scanf("%d", &search); if(notFirst) printf(" "); printf("%d", grades[search]); notFirst++; } return 0; }
成功了!原来想的太复杂了···
以上是关于PAT 乙级 统计同成绩学生的主要内容,如果未能解决你的问题,请参考以下文章