PAT乙級 1038 統計同成績學生
阿新 • • 發佈:2018-11-16
本題要求讀入 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; }
總的來說,是一道比較水的題目。