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.
For each test case, print the smallest number in one line. Do not output leading zeros.
5 32 321 3214 0229 87
22932132143287
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
string s[10010];
bool cmp(string a,string b){
return a+b<b+a; //string型直接拼接来比较
}
int main(){
int n;cin>>n;
for(int i=0;i<n;i++) cin>>s[i];
sort(s,s+n,cmp);
string str;
for(int i=0;i<n;i++)
str+=s[i]; //将排序后数字串拼接起来
int len=str.length();
int k;
for(k=0;k<len;k++){
if(str[k]!='0') break; //找到第一个非0的数字
}
if(k==len) cout<<'0'; //若全为0,直接输出0
else{
for(;k<len;k++)
cout<<str[k];
}
return 0;
}
本文来自我的博客,http://blog.csdn.net/sinat_29278271,还有一些其他的pat题解,如果觉得本文有用不妨前去看看
# include <cstdio>
# include <iostream>
# include <string>
using namespace std;
const int _size = 10000;
string num[_size];
bool cmp(const string& a,const string& b){return a + b< b + a;}
int main()
{
int n,i;
cin >> n;
for (i=0;i<n;i++)
cin >> num[i];
sort(num,num+n,cmp);
string out;
for (i=0;i<n;i++)
out += num[i];
for (i=0;i<out.size()&&out[i]=='0';i++);
if (i==out.size())
printf("0");
else
printf("%s",out.c_str()+i);
printf("\n");
return 0;
}
from functools import cmp_to_key
def cmp(x,y):
x=list(map(int,list(x)))
y=list(map(int,list(y)))
i=j=0
while i<len(x) and j<len(y):
if x[i]!=y[j]:
return x[i]-y[j]
i+=1
j+=1
if i==len(x) and j==len(y):
return 0
elif i==len(x):
return x[0]-y[j]
else:
return x[i]-y[0]
segements=input().split()[1:]
segements.sort(key=cmp_to_key(cmp))
res="".join(segements)
for i in range(0,len(res)):
if res[i]!="0":
res=res[i:]
break
if i==len(res)-1:
res="0"
print(res)
#include<string>
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
int cmp(string a,string b)
{
return a+b<b+a;
}
int main()
{
vector<string> result;
int N;
cin>>N;
for(int i=0;i<N;i++)
{
string tmp;
cin>>tmp;
result.push_back(tmp);
}
sort(result.begin(),result.end(),cmp);
string s;
for(int i=0;i<N;i++)
{
s+=result[i];
}
while(s.length()!=0&&s[0]=='0')
{
s.erase(s.begin());
}
if(s.length()==0)
cout<<"0";
else
cout<<s;
cout<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
bool cmp(string a,string b) {
return a+b<b+a;
}
int main() {
ios::sync_with_stdio(0);
string s[10010];
int n;
cin>>n;
for(int i=0; i<n; i++) {
cin>>s[i];
}
sort(s,s+n,cmp);
string answer;
for(int i=0; i<n; i++) {
answer+=s[i];
}
while(answer[0]=='0'&&answer.size()!=0) {
answer.erase(answer.begin());
}
if(answer.size()!=0){
cout<<answer;
}else{
cout<<0;
}
return 0;
} #include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(string s1, string s2) {
return s1 + s2 < s2 + s1;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int N, total_size = 0;
vector<string> buf;
cin >> N;
buf.resize(N);
for (int i = 0; i < N; ++i) {
cin >> buf[i];
sort(buf.begin(), buf.end(), cmp);
string str;
for(int i = 0; i < buf.size(); i++)
str += buf[i];
int k;
for(k = 0; k < str.size(); k++)
if(str[k] != '0')
break;
if(k == str.size())
cout << '0';
else
for(; k < str.size(); k++)
cout << str[k];
return 0;
}
//参照了上面有个大神的分享,他说的很详细,比喻成冒泡排序,对于任意两个a,b来说如果a+b<b+a
//那么肯定是a排在b前面,那么按照这种方式,每一次就会找一个最大的字符串排到最后面,这样就相当于冒泡排序了
#include<iostream>
(720)#include<vector>
#include<string>
(765)#include<algorithm>
using namespace std;
const int maxn = 10001;
bool cmp(string a, string b) {
return a + b < b + a;
}
int main() {
int n;
cin >> n;
string number[maxn];
int visit[maxn] = { 0 };
for (int i = 0; i < n; i++) {
cin >> number[i];
}
sort(number, number + n, cmp);
string answer = "";
for (int i = 0; i < n; i++) {
answer += number[i];
}
int j = 0;
for (; j < answer.size(); j++) {
if (answer[j] != '0') {
break;
}
}
if (j == answer.size()) {
printf("0");
}
for (; j < answer.size(); j++) {
printf("%c", answer[j]);
}
} #include
#include
#include
#include
using namespace std;
bool com(string a,string b) {//不能按照字典顺序从大到小排序,而是按照两个字符串拼接后的字典顺序排序的
return a + b < b + a;
}
int main() {
string str[10010],s;
int n = 0,index = 0;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> str[i];
}
sort(str,str+n,com);
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" << endl;
else cout << s << endl;
system("pause");
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
string str[N];
bool cmp(string a, string b){
return a+b<b+a;
}
int main(){
ios::sync_with_stdio(false);
int n;
string ans;
cin>>n;
for(int i = 0; i < n; i++) cin>>str[i];
sort(str,str+n,cmp);
for(int i = 0; i < n; i++) ans+=str[i];
n = ans.length();
int i = 0;
while(i < n&&ans[i]=='0') i++;
if(i==n) cout<<"0"<<endl;
else cout<<ans.substr(i)<<endl;
return 0;
}
from functools import cmp_to_key
def bikey(a,b):
return int(a+b)-int(b+a)
lst = input().split()[1:]
lst.sort(key = cmp_to_key(bikey))
print(int(''.join(lst))) //排序即可
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n;
string A[maxn];
int main(){
cin>>n;
for(int i=1;i<=n;++i)
cin>>A[i];
sort(A+1,A+1+n,[](const string &x,const string &y){ return x+y<y+x;});
string ans;int i=0;
for(int i=1;i<=n;++i) ans+=A[i];
while(ans[i]=='0'&&i<ans.size()-1) ++i;
for(;i<ans.size();++i) cout<<ans[i];
return 0;
}
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 10000 + 10;
string num[maxn];
bool compare(string s1, string s2){
string num1 = s1 + s2;
string num2 = s2 + s1;
return num1 < num2;
}
int main(){
int n, pos = -1;
cin >> n;
string s;
for(int i=0; i<n; i++)
cin >> num[i];
sort(num, num+n, compare);
s = num[0];
for(int i=1; i<n; i++)
s = s + num[i];
for(int i=0; i<s.size(); i++){
if(s[i] != '0'){
pos = i;
break;
}
}
if(pos == -1) cout << "0" << endl;
else{
string temp = s.substr(pos);
cout << temp << endl;
}
return 0;
} #include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10005;
string num[maxn];
bool cmp(string a,string b){
return a+b<b+a;
}
int main(){
//freopen("in.txt","r",stdin);
int n;
string ans="";
cin>>n;
for(int i=0;i<n;i++){
cin>>num[i];
}
sort(num,num+n,cmp);
for(int i=0;i<n;i++){
ans.append(num[i]);
}
int len=ans.length(),pos=-1;
for(int i=0;i<len;i++){
if(ans[i]!='0'){
pos=i;
break;
}
}
if(pos<0){
printf("0\n");
}
else{
for(int i=pos;i<len;i++){
printf("%c",ans[i]);
}
printf("\n");
}
return 0;
}