• 洛谷P1012 拼数


    题目描述

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

    例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213

    又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613

    输入格式

    第一行,一个正整数n

    第二行,n个正整数。

    输出格式

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

    输入输出样例

    输入 #1
    3
    13 312 343
    
    输出 #1
    34331213

    
    
    题目标签上写着
    “字符串”和“排序”
    妙啊,
    一眼把这题秒了
    那我们怎么来对字符串进行排序呢?
    (我还以为这题挺简单来着
    通过信息技术查阅资料(看题解)我才知道
    string类型中对字符串也定义了两个运算符
    <的定义为按字典序比较,
    +的定义为字符串直接连接
    那现在假设我们有了两个字符串a=131,b=232;
    那我们考虑a+b和b+a之间的区别
    因为此时string类型中的+表示的是链接
    则a+b=131232
    b+a=232131
    很明显有b+a>a+b
    那我们考虑重载cmp然后用sort排字符串
    bool cmp(const string &a,const string &b) { return (a+b>b+a); }
    这就有了一个字符串比较函数
    那我们怎么证明这个结论一定完全正确呢?
    请读者自证(大雾
    那好吧我们来分类讨论一下
    首先是两者不一样长的情况
    我们首先要判断两者的最高位
    最高位大者在前
    如果两者长度相同
    则还是先比较最大的位数
    只要字典序大的则放在前面
    于是重载一个string类型的cmp并用sort
    于是就
    很爽,就很爽
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=25;
    int n;
    string in[maxn];
    bool cmp(const string &a,const string &b) {return a+b>b+a;}
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>in[i];
        sort(in+1,in+1+n,cmp);
        for(int i=1;i<=n;i++)
             cout<<in[i];
        cout<<endl;
        return 0;
    }
    //4073213221713513
    
    
    





  • 相关阅读:
    梯度下降的矩阵分解公式推导
    再谈矩阵分解在推荐系统中的应用
    浅谈矩阵分解在推荐系统中的应用
    tomcat局域网内发布html
    通过JavaScript动态生成html控件
    html 复选框checkbox
    HTML <frameset>不同frame之间传值
    OpenLayers 案例一
    ubuntu java开发环境jdk安装
    如何成为Python高手
  • 原文地址:https://www.cnblogs.com/Jiangxingchen/p/13253818.html
Copyright © 2020-2023  润新知