解题报告:给若干个居民的年龄排序,年龄的范围在1到100之间,输入的总人数在0到200W。这题要注意的输入的文件约有25MB,而内存限制为2MB,所以如果人数是像200W这样多的话,甚至都不能把它们都读入内存,所以就不能用快速排序等各种排序,只能通过标记来进行排序,这题很明显的一个特征就是要排序的数字都不大,只有1到100,要排序的数字的个数大于要排序的数字的范围,所以我们可以定义一个数组age[105],然后将他各个都初始化为0,若输入了一个数,则将以这个数为下标的上标相应的加1,表示年龄是这个数字的人有多少个。最后只要从1到100将这些数字根据它们的个数输出来就可以了.
#include<cstdio>
#include<cstring>
int n,age[];
int main() {
while(scanf("%d",&n)&&n) {
int a;
memset(age,,sizeof(age));
for(int i=;i<n;++i) {
scanf("%d",&a);
age[a]++;
}
bool flag = ;
for(int i=;i<=;++i)
for(int j=;j<age[i];++j) {
if(!flag) printf(" ");
flag=;
printf("%d",i);
} printf("\n");
}
return ;
}