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 <algorithm> #include <map> #include <string> #include <vector> using namespace std; bool cmp(const string& a,const string& b) { string s1 = a + b; string s2 = b + a; return s1 < s2; } bool zero(const string& x) { for(int i = 0;i < x.size();++ i) if (x[i] != '0') return false; return true; } int main() { int n; vector<string> data; cin >> n; for(int i = 0;i < n;++ i) { string tmp; cin >> tmp; data.push_back(tmp); } sort(data.begin(),data.end(),cmp); int idx(0); while(idx < data.size()) { if (zero(data[idx])) ++ idx; else break; } if (idx == data.size()) cout << "0"; else { data[idx] = data[idx].substr(data[idx].find_first_not_of('0')); for (int i = idx;i < data.size();++ i) cout << data[i]; } }