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...