题目:
1038 统计同成绩学生 (20 分) 本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出。
输入格式:
输入在第 1 行给出不超过 10^5 的正整数 N,即学生总人数。随后一行给出 N 名学生的百分制整数成绩,中间以空格分隔。最后一行给出要查询的分数个数 K(不超过 N 的正整数),随后是 K 个分数,中间以空格分隔。
输出格式
在一行中按查询顺序给出得分等于指定分数的学生人数,中间以空格分隔,但行末不得有多余空格。
思路
这道题是桶排序的思想。
桶排序是所有排序中最简单的排序之一。桶排序重要的是它的思想,而不是具体实现,那么什么是桶排序呢?
百科是这样说的:桶排序的工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。
其实就是将待排序的序列分到若干个桶中,每个桶内的元素再进行个别排序。 这道题就是将相同分数的人都放在一个桶里,而用数组来表示各个桶。
//foreverking
#include <vector>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int n,k;
int main() {
cin >> n;
vector<int> v(101);
for (int i = 0; i < n; i++){
/* code */
int x;
cin >> x;
v[x]++;
}
cin >> k;
for(int i = 0; i < k; i++){
int temp;
cin >> temp;
if(i != 0)
cout << " ";
cout << v[temp];
}
cout << endl;
return 0;
}