Time limit: 5.000 seconds
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=460&page=show_problem&problem=2457
You are given the ages (in years) of all people of a country with at least 1 year of age. You know that no individual in that country lives for 100 or more years. Now, you are given a very simple task of sorting all the ages in ascending order.
There are multiple test cases in the input file. Each case starts with an integer n (0<n<=2000000), the total number of people. In the next line, there are n integers indicating the ages. Input is terminated with a case where n = 0. This case should not be processed.
For each case, print a line with n space separated integers. These integers are the ages of that country sorted in ascending order.
Warning: Input Data is pretty big (~ 25 MB) so use faster IO.
5 3 4 2 1 5 5 2 3 2 3 1 0 |
1 2 3 4 5 1 2 2 3 3 |
Note: The memory limit of this problem is 2 Megabyte Only.
注意注意:内存限制自由2M,所以sort不可用,但数字的范围在1~100间,所以用计数排序
复杂度:O(n)
完整代码:
/*0.158s*/ #include<cstdio> #include<cstring> #include<cctype> int buf[10]; // 声明成全局变量可以减小开销 inline int readint() { char c = getchar(); while (!isdigit(c)) c = getchar(); int x = 0; while (isdigit(c)) { x = x * 10 + (c & 15); // 数字处理优化,少了4ms c = getchar(); } return x; } inline void writeint(int i) { int p = 0; if (i == 0) p++; // 特殊情况:i等于0的时候需要输出0,而不是什么也不输出 else while (i) { buf[p++] = i % 10; i /= 10; } for (int j = p - 1; j >= 0; j--) putchar('0' + buf[j]); // 逆序输出 } int main(void) { int n, x, c[101]; while (n = readint()) { memset(c, 0, sizeof(c)); for (int i = 0; i < n; i++) c[readint()]++; int first = 1; for (int i = 1; i <= 100; i++) for (int j = 0; j < c[i]; j++) { if (!first) putchar(' '); first = 0; writeint(i); } putchar('\n'); } return 0; }