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 题目地址:http://www.patest.cn/contests/pat-a-practise/1038
ac代码:
// #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <string> #include <vector> #include <queue> #include <algorithm> #include <iterator> using namespace std ; #define INF 999999 #define N 105 int n ; vector<string> vt ; bool cmp(string s1 , string s2) { string sum1 = s1 + s2 ; string sum2 = s2 + s1 ; return sum1 < sum2 ; } int main() { //freopen("in.txt","r",stdin); string stmp ; int i ; scanf("%d" , &n) ; for( i = 0 ;i < n ; i++) { cin >> stmp ; vt.push_back(stmp); } sort(vt.begin() , vt.end() , cmp); string ss = ""; for(i = 0 ; i < n ; i++) // 先直接把 所有的字符一次加起来 { ss += vt[i] ; } if(ss.find_first_not_of("0") == string::npos) // 如果是全零的 直接输入一个零 { printf("0"); }else{ //否则 Do not output leading zeros. int len = ss.size() ; i = 0 ; while(ss[i++] == '0') ; i = i - 1 ; for( ; i < len; i++) { printf("%c" , ss[i]) ; } } printf("\n") ; return 0 ; }