1038 统计同成绩学生——c实现

1038 统计同成绩学生 (20 分)

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

输入格式:

输入在第 1 行给出不超过 10​5​​ 的正整数 N,即学生总人数。随后一行给出 N 名学生的百分制整数成绩,中间以空格分隔。最后一行给出要查询的分数个数 K(不超过 N 的正整数),随后是 K 个分数,中间以空格分隔。

输出格式:

在一行中按查询顺序给出得分等于指定分数的学生人数,中间以空格分隔,但行末不得有多余空格。

输入样例:

10
60 75 90 55 75 99 82 90 75 50
3 75 90 88

输出样例:

3 2 0

思路:这道题遵循题目意思编程问题不大,唯一的考察难点是时间复杂度的计算和简化。程序设计的不好,会导致程序的时间复杂度增大,从而计算超时。比如下面的代码1也可以实现功能,但会超时。代码2就不会。

代码1:

//PAT1038V1
#include 

int main(){
	int n,i,j,k,tmp,count=0;
	scanf("%d",&n);
	int a[n];
	for(i=0;i

时间复杂度:代码1的时间复杂度主要出现在for循环环节,时间复杂度O(n+n*k)≈O(k*n)。

空间复杂度:int型变量n,i,j,k,tmp,count一共6个,空间花销为4*6=24;int型数组a[n],空间花销为4n。总共的空间复杂度为S(4n+6)≈S(4n)

代码2:

//PAT1038V1
#include 

int main(){
	int n,i,k,score;
	scanf("%d",&n);
	int a[100001]={0};
	for(i=0;i

时间复杂度:代码2的时间复杂度主要出现在for循环环节,时间复杂度O(n+k)≈O(n)。

空间复杂度:int型变量n,i,k,score一共4个,空间花销为4*4=16;int型数组a[100001],空间花销为100001。总共的空间复杂度为为定值。

但是相比代码1时间复杂度变为原来的1/k。

你可能感兴趣的:(c,PAT)