给定N(N<10000)段“数字片段”,把它们连成一个数,要求连成的数尽量小。
当时有个朦胧的想法是“我要把小的片段尽量排前面”,但是怎么样算是“小的片段”呢?
然后是想到“前面的不会影响到后面的”,我不知道具体该怎么表达,反正想到“前面的不会影响到后面的”以后,就感觉这个问题是贪心着来,不用动规着来,也就是说,只用一遍排序,然后就可以连起来输出了。
然后思考的就是,一遍排序,那么只需要对“数字片段”进行两两地判大小就好。
所以重点就在怎么比较了。显然,片段a和片段b如果一样长,比较方法就不用说了。如果其中有一个比较长,比如说b比a长,那么,先比较b前面那部分,如果b前面还没超出a长度的那部分就能比出大小,那也没问题了。如果b前面还没有超出a的部分,每一位都跟a的对应位相等,怎么办?我的方法是比较a+b和b+a。(还是说不出理由来,各种凭直觉呃)
就这样,过掉了。
#include<cstdio>
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=10003;
string s[N];
int n;
bool comp(string a,string b){
string c;
int i;
for(i=0;i<a.length()&&i<b.length();i++)
if(a[i]!=b[i])
return a[i]<b[i];
c=a;
a=a+b;
b=b+c;
return a<b;
}
int main(){
scanf("%d",&n);
int i;
for(i=0;i<n;i++)
cin>>s[i];
sort(s,s+n,comp);
string ans="";
for(i=0;i<n;i++)
ans+=s[i];
while(ans.size()>1&&ans[0]=='0')
ans.erase(ans.begin());
cout<<ans<<endl;
return 0;
}