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 87Sample Output:
22932132143287
#if 1 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MIN(a,b) ((a) < (b) ? (a):(b)) int cmpstr(char *a,char *b,int n) { int alen = strlen(a); int blen = strlen(b); if(strncmp(a,b,n) == 0) return cmpstr(a+n,b,n); else return strncmp(a,b,n); } int cmp(const void *a,const void *b) { int alen = strlen(( char*)a); int blen = strlen(( char*)b); int min = MIN(alen,blen); if(min == blen) return cmpstr(( char*)a,( char *)b,min); else return cmpstr(( char*)b,( char *)a,min) < 0 ? 1 : -1; } #define MAXN (100000+1) char a[MAXN][40]; int main(int argc,char *argv[]) { int i,j; int n; int flag; freopen( "D:\\Chengsq\\in.txt" , "r" ,stdin); freopen( "D:\\Chengsq\\out.txt", "w" ,stdout); while(scanf( "%d",&n) != EOF) { for(i = 0;i < n;i++) scanf( "%s",a[i]); qsort(a,n, sizeof(a[0]),cmp); flag = 0; for(i = 0;i < n;i++) { for(j = 0; j < strlen(a[i]);j++) { if(flag) //是否已经输出非零的字符 printf( "%c",a[i][j]); else if(a[i][j] != '0') { printf( "%c",a[i][j]); //输出第一个非零的字符 flag = 1; } } } if(flag ==0) printf( "0"); printf( "\n"); } return 0; } #endif