洛谷 1012 拼数(NOIp1998提高组)
【题解】
我们要做的就是把这些数排序。排序的时候判断两个数是否交换的方法,就是把这两个数相接形成两个长度相同的数字,比较这两个数字的大小。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define N 200010 5 #define rg register 6 #define LL long long 7 using namespace std; 8 int n,m; 9 char s[N][200]; 10 inline int read(){ 11 int k=0,f=1; char c=getchar(); 12 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 13 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); 14 return k*f; 15 } 16 inline bool check(int x,int y){ 17 char a[200],b[200]; 18 int l1=strlen(s[x]+1),l2=strlen(s[y]+1),l=l1+l2; 19 for(rg int i=1;i<=l1;i++) a[i]=s[x][i],b[i+l2]=s[x][i]; 20 for(rg int i=1;i<=l2;i++) b[i]=s[y][i],a[i+l1]=s[y][i]; 21 for(rg int i=1;i<=l;i++){ 22 if(a[i]>b[i]) return 1; 23 else if(a[i]<b[i]) return 0; 24 } 25 return 1; 26 } 27 int main(){ 28 n=read(); 29 for(rg int i=1;i<=n;i++) scanf("%s",s[i]+1); 30 for(rg int i=1;i<n;i++) 31 for(rg int j=i+1;j<=n;j++) if(!check(i,j)) swap(s[i],s[j]); 32 for(rg int i=1;i<=n;i++) printf("%s",s[i]+1); 33 puts(""); 34 return 0; 35 }