1. 程式人生 > 其它 >1038 統計同成績學生 (20 分)

1038 統計同成績學生 (20 分)

技術標籤:PAT乙級c++

本題要求讀入 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

題解:

#include<iostream>
using namespace std; int main() { ios::sync_with_stdio(false); int n; scanf("%d", &n); int a[101] = { 0 };//儲存各個分數人的個數 int score; for (int i = 0; i < n; i++) { scanf("%d", &score); a[score]++; } scanf("%d", &n); for (int i = 0; i < n; i++) {//根據要查詢的分數,輸出對應的有多少學生
scanf("%d", &score); if (i != 0) printf(" "); printf("%d", a[score]); } return 0; }

剛開始做法:傻傻的去挨個找,導致最後一個測試點一直超時
auto idx = lower_bound(a.begin(), a.end(), score[i]);//二分查詢下標----->時間複雜度log(n)
在這裡插入圖片描述

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std; int main() { ios::sync_with_stdio(false); int n; scanf("%d", &n); vector<int>a(n); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } sort(a.begin(), a.end()); scanf("%d", &n); vector<int>score(n); for (int i = 0; i < n; i++) { scanf("%d", &score[i]); } vector<int>ans(101, 0); for (int i = 0; i < score.size(); i++) { auto idx = lower_bound(a.begin(), a.end(), score[i]);//二分查詢下標 for (auto it = idx; it != a.end(); it++) { if (score[i] == *it) { ans[score[i]]++; } else { break; } } } for (int i = 0; i < score.size(); i++) { if (i != 0) printf(" "); printf("%d", ans[score[i]]); } return 0; }