1038. Recover the Smallest Number (30)

来源:互联网 发布:手机淘宝秒杀神器 编辑:程序博客网 时间:2024/05/22 08:21

1038. Recover the Smallest Number (30)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

Given a collection of number segments, you are supposed to recover the smallest number from them. For example, given {32, 321, 3214, 0229, 87}, we can recover many numbers such like 32-321-3214-0229-87 or 0229-32-87-321-3214 with respect to different orders of combinations of these segments, and the smallest number is 0229-321-3214-32-87.

Input Specification:

Each input file contains one test case. Each case gives a positive integer N (<=10000) followed by N number segments. Each segment contains a non-negative integer of no more than 8 digits. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print the smallest number in one line. Do not output leading zeros.

Sample Input:
5 32 321 3214 0229 87
Sample Output:
22932132143287
剑指offer,Q33
#include <stdio.h>  #include <stdlib.h>  #include <string.h>#define MAX 10010char s[MAX][10];char s1[30];char s2[30];int cmp(const void *a, const void *b){strcpy(s1, (const char *)a);strcat(s1, (const char *)b);strcpy(s2, (const char *)b);strcat(s2, (const char *)a);return strcmp(s1, s2);}int main(){int N, i, j;int flag;//freopen("d:\\input.txt", "r", stdin);  scanf("%d", &N);for (i = 0; i < N; ++i){scanf("%s", s[i]);}qsort(s, N, sizeof(s[0]), cmp);flag = 0;for (i = 0; i < N; i++){for (j = 0; s[i][j] != 0; j++){if (s[i][j] != '0'){flag = 1;break;}}if (flag){break;}}if (!flag){puts("0");return 0;}printf("%s", s[i] + j);for (i = i + 1; i < N; ++i){printf("%s", s[i]);}return 0;}



0 0