P1271 【深基9.例1】选举学生会
学校正在选举学生会成员,有 n(n≤999)名候选人,每名候选人编号分别从 1 到 n,现在收集到了 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
桶排序
想要完成这个题,得先了解桶排序(给出现过的数字做标记)。
#include<stdio.h>
int main()
{
int book[1001],t,n;
scanf("%d",&n);
//初始化
for(int i=0;i<=1000;i++)
{
book[i]=0;
}
//依次读入 计数
for(int i=0;i<n;i++)
{
scanf("%d",&t);
book[t]++;
}
//依次判断 出现几次打印几次
//票上的值
for(int i=1000;i>=0;i--)//从大到小排序
{
//多少张重复的票
for(int j=1;j<=book[i];j++)
{
printf("%d\n",i);
}
}
}
(来自啊哈算法)
题解
了解了桶排序之后,就可以照葫芦画瓢完成这道题了。但是需要注意的是,因为m<=2000000,数值太大,栈区空间不够,需要动态分配内存到堆区。
#include <stdio.h>
#include <stdlib.h>
int main()
{
long long int n, m;
//malloc和calloc的区别:
//calloc能初始化值使其为0,malloc则不行
long long int *a = (long long int*)calloc(2000001, sizeof(long long int));
long long int *arr = (long long int*)calloc(1000, sizeof(long long int));
scanf("%lld %lld", &n, &m);
for (int i = 0; i < m; i++)
{
scanf("%lld", &a[i]);
}
for (int i = 0; i < m; i++)
{
arr[a[i]] += 1;
}
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < arr[i]; j++)
{
printf("%lld ", i);
}
}
free(a);
free(arr);
return 0;
}