• 洛谷 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 }
    View Code
  • 相关阅读:
    【模板】高斯消元
    【洛谷P1730】最小密度路径
    【模板】矩阵乘法优化线性递推
    【洛谷P3723】礼物
    【洛谷P3338】力
    【模板】NTT
    【洛谷P1919】A*B Problem升级版
    测试理论基础(思维导图)
    Fiddler
    常用 Linux 命令
  • 原文地址:https://www.cnblogs.com/DriverLao/p/9399965.html
Copyright © 2020-2023  润新知