PAT (Basic Level) Practise (中文)-1038. 统计同成绩学生(20)

PAT (Basic Level) Practise (中文)-1038. 统计同成绩学生(20)    http://www.patest.cn/contests/pat-b-practise/1038

本题要求读入N名学生的成绩,将获得某一给定分数的学生人数输出。

输入格式:

输入在第1行给出不超过105的正整数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



这道题,题目简洁,信息类别少,数据量小,input简单,output简单。
我见过有人写了一百多行的代码,功能很全,按分数排序、每一分数值的统计、二分查找某一分数,每一个子功能都很优化,是段很完美的代码。
但是想一下,我们做这道题时,是在锻炼自己的编程能力?回忆自己学过的算法?还是为了解决一个问题?

考试时这么干毕竟耗时耗力,并且处理复杂,一旦出错,要排查很多地方。
分析:这道题要求的结果是指定分数的学生人数,也就是有效信息只是一个分数和这个分数的学生人数。
所以我们只需要设法保存这两个信息就可以了。为了节省时间,最简单的方法就是用分数值作下标。而分数只可能取值0~100,所以开一个int [101]即可。而学生总人数不超过100000,int足够使用了。

省时省力省内存,并不能再精简了,努力做一个精简主义的孩子,省感情。
 
 1 #include<cstdio>
 2 
 3 int main()
 4 {
 5     int fenshu[101]={0},chafen=0;
 6     int num=0,temp=0;
 7     scanf("%d",&num); 
 8     for(int i=0;i<num;i++) 
 9     {
10             scanf("%d",&temp);
11             if(0<=temp && temp<=100) fenshu[temp]++;
12     }
13     scanf("%d",&num);  
14     for(int i=0;i<num;i++)
15     {
16             scanf("%d",&chafen);
17             if(i) printf(" %d",fenshu[chafen]);
18             else printf("%d",fenshu[chafen]);
19     }    
20     return 0;    
21 }


我已经原谅自己并不能再渣的英语水平了。。。I AM WHAT I AM...



原文地址:https://www.cnblogs.com/asinlzm/p/4442025.html