zoukankan      html  css  js  c++  java
  • NOIP1998拼数

    题目描述

    设有nn个正整数(n≤20)(n20),将它们联接成一排,组成一个最大的多位整数。

    例如:n=3n=3时,33个整数1313,312312,343343联接成的最大整数为:3433121334331213

    又如:n=4n=4时,44个整数77,1313,44,246246联接成的最大整数为:74246137424613

    输入输出格式

    输入格式:

    第一行,一个正整数nn。

    第二行,nn个正整数。

    输出格式:

    一个正整数,表示最大的整数

    输入输出样例

    输入样例#1: 
    3
    13 312 343
    
    输出样例#1: 
    34331213

    日常被卡
    上来的第一眼是个排序,然而就是排序,只不过排序的方式不太一样
    我想到的方法:
    将每个输的长度定为一样的,然后按大小排序,最后输出原来的数
    但是这样做有一个漏洞,比如说在有三个数321 32 3的时候,会排成321323,但是正确答案是323321

    所以我们来向一个新的排序方法,每次在交换两个数的时候,对比一下把他们按两种方式排列的新生成的数的大小
    实现的话在C++中有STL可以用(C党福利)
    还有就是scanf编译死活过不了,有大佬知道的话麻烦在评论区告知一下,蒟蒻万分感谢
    下面给出代码:
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    inline int min(int a,int b){return a<b?a:b;}
    inline int max(int a,int b){return a>b?a:b;}
    inline long long rd(){
        long long x=0,f=1;
        char c=getchar();
        for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
        for(;isdigit(c);c=getchar()) x=x*10+c-'0';
        return x*f;
    }
    inline void write(long long x){
         if(x<0) putchar('-'),x=-x;
         if(x>9) write(x/10);
         putchar(x%10+'0');
         return ;
    }
    int n;
    string a[106];
    string f;
    bool cmp(string c,string d){return c+d>d+c;}
    int main(){
        n=rd();
        for(int i=1;i<=n;i++) cin>>a[i];
        sort(a+1,a+n+1,cmp);
        for(int i=1;i<=n;i++) cout<<a[i];
        return 0;
    }
    /*
    6
    321 32 407 135 13 217
    */
    蒟蒻总是更懂你✿✿ヽ(°▽°)ノ✿
  • 相关阅读:
    【转载】SG定理
    P3235 [HNOI2014]江南乐(Multi-Nim)
    斐波那契数列
    WC2021游记
    线性基性质证明和应用
    「NOI2018」屠龙勇士
    XiaoMi Interview Log
    打靶训练
    八皇后问题
    Docker的一些常用
  • 原文地址:https://www.cnblogs.com/WWHHTT/p/9788207.html
Copyright © 2011-2022 走看看