题目描述
学校正在选举学生会成员,有 n(n\le 999)n(n≤999) 名候选人,每名候选人编号分别从 1 到 nn,现在收集到了 m(m<=2000000)m(m<=2000000) 张选票,每张选票都写了一个候选人编号。现在想把这些堆积如山的选票按照投票数字从小到大排序。
输入格式
输入 n 和 m 以及 m 个选票上的数字。
输出格式
求出排序后的选票编号。
输入输出样例
输入 #1
5 10 2 5 2 2 5 2 2 2 1 2
输出 #1
1 2 2 2 2 2 2 2 5 5
值得一提的是,本题解所使用的方法并没有用到sort之类的排序算法,而是将选票数量存储在对应选票人下标的数组中,最后再逐一输出。
看到题目中“候选人”人数远远小于“选票”数量,第一时间想到用一个数组的下标表示第i个候选人的选票数量(这表明从第二项开始用,a[0]未被使用)。有了这个想法,代码撰写思路就比较清晰了。
#include<iostream>
using namespace std;
int n,m,temp;
int a[1005];
int main(){
scanf("%d %d",&n,&m);
//存储对应的选票数量
for(int i=1;i<=m;i++){
scanf("%d",&temp);
a[temp]++;
}
//依次输出对应的选票下标
for(int i=1;i<=n;i++){
if(i<n){
for(int j=1;j<=a[i];j++){
printf("%d ",i);
}
}else{
for(int j=1;j<=a[i];j++){
if(j<a[i])
printf("%d ",i);
else
printf("%d\n",i);
}
}
}
}
感谢审核及观看!