题目
1038 Recover the Smallest Number (30分)
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 (≤104) 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. Notice that the first digit must not be zero.
Sample Input:
5 32 321 3214 0229 87
Sample Output:
22932132143287
题目大意
给出N个数字,求出将这些数字拼接得到的数字中最小的那个数字
思路
当只有两个数字a、b的时候,有a拼接b和b拼接a两种情况,此时,将这两个数字用字符串表示的话,当a+b < b+a的时候,a+b表示的数字小于 b+a表示的数字;
当有N个数字当时候,对N个数字以此方法排序即可
代码
#include<bits/stdc++.h>
using namespace std;
bool cmp(const string a, const string b){
return a+b < b+a;
}
int main(int argc, const char * argv[]) {
int N;
string s, res="";
cin>>N;
vector<string> v(N);
for(int i=0; i<N; i++){
cin>>v[i];
}
sort(v.begin(), v.end(), cmp);
for(auto it : v)
res += it;
int st = 0;
while(st < res.size() && res[st] == '0') st++;
if(st == res.size()) cout<<'0';
else{
for(int i=st; i<res.size(); i++)
cout<<res[i];
}
return 0;
}