解题报告:给若干个居民的年龄排序,年龄的范围在1到100之间,输入的总人数在0到200W。这题要注意的输入的文件约有25MB,而内存限制为2MB,所以如果人数是像200W这样多的话,甚至都不能把它们都读入内存,所以就不能用快速排序等各种排序,只能通过标记来进行排序,这题很明显的一个特征就是要排序的数字都不大,只有1到100,要排序的数字的个数大于要排序的数字的范围,所以我们可以定义一个数组age[105],然后将他各个都初始化为0,若输入了一个数,则将以这个数为下标的上标相应的加1,表示年龄是这个数字的人有多少个。最后只要从1到100将这些数字根据它们的个数输出来就可以了.

1 #include<cstdio> 2 #include<cstring> 3 int n,age[101]; 4 int main() { 5 while(scanf("%d",&n)&&n) { 6 int a; 7 memset(age,0,sizeof(age)); 8 for(int i=0;i<n;++i) { 9 scanf("%d",&a); 10 age[a]++; 11 } 12 bool flag = 1; 13 for(int i=1;i<=100;++i) 14 for(int j=0;j<age[i];++j) { 15 if(!flag) printf(" "); 16 flag=0; 17 printf("%d",i); 18 } 19 20 printf(" "); 21 } 22 return 0; 23 }