1. 程式人生 > >PAT乙級 1038 統計同成績學生

PAT乙級 1038 統計同成績學生

本題要求讀入 N 名學生的成績,將獲得某一給定分數的學生人數輸出。

輸入格式:

輸入在第 1 行給出不超過 105的正整數 N,即學生總人數。隨後一行給出 N 名學生的百分制整數成績,中間以空格分隔。最後一行給出要查詢的分數個數 K(不超過 N 的正整數),隨後是 K 個分數,中間以空格分隔。

輸出格式:

在一行中按查詢順序給出得分等於指定分數的學生人數,中間以空格分隔,但行末不得有多餘空格。

輸入樣例:

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

輸出樣例:

3 2 0

思路:

開始時的思路比較傻,設定了兩個陣列,第一個陣列a存放所有學生的成績,第二個陣列b存放要統計的分數,然後是一個雙重迴圈,在迴圈當中統計相同分數的學生的個數。

#include<stdio.h>
int main(){
	int N,K;
	int a[100000],b[100000];
	scanf("%d",&N);
	for(int i=0;i<N;++i){
		scanf("%d",&a[i]);
	}
	scanf("%d",&K);
	for(int i=0;i<K;++i){
		scanf("%d",&b[i]);	
	}
	for(int i=0;i<K;++i){
		int cnt=0;
		for(int j=0;j<N;++j){
			if(a[j]==b[i]){
				++cnt; 
			}
		}
		printf("%d",cnt);
		if(i!=K-1){
			printf(" ");
		}
	}
	return 0;
} 

在這裡插入圖片描述

出現的問題:

測試點3執行超時。

第一次修改:

既然是要統計相同分數的學生的人數,而分數∈[0,100],因此可以設定一個大小為101的陣列,以下標表示分數,陣列記憶體放該分數下的學生的人數,於是問題便迎刃而解。

#include<stdio.h>
int main(){
	int N,K;
	int a[101]={0},b[100000],temp;
	scanf("%d",&N);
	for(int i=0;i<N;++i){
		scanf("%d",&temp);
		++a[temp]; 
	}
	scanf("%d",&K);
	for(int i=0;i<K;++i){
		scanf("%d",&b[i]);	
	}
	for(int i=0;i<K;++i){
		printf("%d",a[b[i]]);
		if(i!=K-1){
			printf(" "); 
		}
	}
	return 0;
}

在這裡插入圖片描述
總的來說,是一道比較水的題目。