ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NC16783 [NOIP1998]拼数

2022-06-15 18:33:58  阅读:196  来源: 互联网

标签:13 正整数 string 拼数 int NC16783 整数 str NOIP1998


NC16783 [NOIP1998]拼数

题目

题目描述

设有 \(n\) 个正整数(\(n ≤ 20\)),将它们联接成一排,组成一个最大的多位整数。
例如:\(n=3\) 时,\(3\) 个整数 \(13\),\(312\) ,\(343\) 联接成的最大整数为:\(34331213\)
又如:$n=4 $ 时,\(4\) 个整数 \(7\) ,\(13\) ,\(4\) ,\(246\) 联接成的最大整数为:\(7424613\)

输入描述

第一行,一个正整数 \(n\) 。
第二行,\(n\) 个正整数。

输出描述

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

示例1

输入

3
13 312 343

输出

34331213

题解

思路

知识点:贪心。

显然,根据字典序排列数字是最优的。但问题在于一些包含关系的数字是不符合的,如 \(989\) 和 \(9899\) 并不能单纯看字典序。

考虑看前后两者的和字符串的字典序排序,首先如果两者并不是包含关系,则这种排序不会因此改变;如果两者是包含关系可以用这种方法更进一步排序,注意这里传递性是要证明的,具体用数学归纳法即可。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

string str[27];

bool cmp(string a,string b){
    return a+b>b+a;
}

int main(){
    int n;
    cin>>n;
    for(int i = 0;i<n;i++){
        cin>>str[i];
    }
    sort(str,str+n,cmp);
    for(int i = 0;i<n;i++){
        cout<<str[i];
    }
    cout<<'\n';
    return 0;
}

标签:13,正整数,string,拼数,int,NC16783,整数,str,NOIP1998
来源: https://www.cnblogs.com/BlankYang/p/16379462.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有