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; }