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:
22932132143287sort排序,然后根据a+b>b+a交换ab顺序
注意输出
1.有可能第一个数全部都是0,第二个数开头也是0
2.有可能全部都是0
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
bool cmp(string a,string b){
return a<b;
}
int main(){
int n;
cin>>n;
string a[10001];
for(int i=0;i<n;i++){
string fz;
cin>>a[i];
}
sort(a,a+n,cmp);
int i;
for(i=0;i<n;i++){
string c=a[i]+a[i+1];
string c2=a[i+1]+a[i];
if(c>c2){
string fz=a[i];
a[i]=a[i+1];
a[i+1]=fz;
}
}
int flag=0;
for(int i=0;i<n;i++){
if(flag==0)
for(int j=0;j<a[i].size();j++){
if(a[i][j]!='0'){
for(int k=j;k<a[i].size();k++){
cout<<a[i][k];
flag=1;
}
break;
}
}
else cout<<a[i];
}
if(flag==0) cout<<0;
return 0;
}
这是在网上看到的代码。很简洁。直接根据a+b<b+a 排序,然后把字符串拼接起来,去掉最前面的0
字符串去掉前面的0
s.erase(s.begin()); 就行!
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp0(string a, string b) {
return a + b < b + a;
}
string str[10010];
int main() {
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
cin >> str[i];
sort(str, str + n, cmp0);
string s;
for(int i = 0; i < n; i++)
s += str[i];
while(s.length() != 0 && s[0] == '0')
s.erase(s.begin());
if(s.length() == 0)
cout << 0;
else
cout << s;
return 0;
}