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
- #include <iostream>
- #include <string>
- #include <algorithm>
- #include <memory.h>
- #include <cstdio>
- #include <cstdlib>
- #include <vector>
- using namespace std;
- #define MAX 0Xfffffff
- string a[10001];
- bool cmp(string s1, string s2){
- return s1+s2<s2+s1;
- }
- int main(){
- //freopen("in.txt", "r", stdin);
- int n;
- cin>>n;
- for(int i=0;i<n;++i){
- cin>>a[i];
- }
- sort(a, a+n, cmp);
- bool first = true;
- bool print = false;
- for(int i=0;i<n;++i){
- int len = a[i].length();
- for(int j=0;j<len;++j){
- if(first){
- if(a[i][j]!='0'){
- printf("%c", a[i][j]);
- print = true;
- first = false;
- }
- }else{
- printf("%c", a[i][j]);
- print = true;
- }
- }
- }
- if(!print)
- printf("0");
- printf("\n");
- //fclose(stdin);
- }