【洛谷 P1012】[NOIP1998 提高组] 拼数 题解(贪心算法+字典序排序)

[NOIP1998 提高组] 拼数

题目描述

设有 n n n 个正整数 a 1 ... a n a_1 \dots a_n a1...an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。

输入格式

第一行有一个整数,表示数字个数 n n n。

第二行有 n n n 个整数,表示给出的 n n n 个整数 a i a_i ai。

输出格式

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

样例 #1

样例输入 #1

3
13 312 343

样例输出 #1

34331213

样例 #2

样例输入 #2

4
7 13 4 246

样例输出 #2

7424613

提示

对于全部的测试点,保证 1 ≤ n ≤ 20 1 \leq n \leq 20 1≤n≤20, 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1≤ai≤109。


思路

比较函数 cmp 用于确保拼接后的数值最大。

当用下面这个函数直接比较 x 和 y 的字典序时,虽然能通过大部分样例,但是仍有少量测试点 WA。

cpp 复制代码
bool cmp(string x, string y)
{
    return x > y;
}

为什么会这样呢?

举个例子:当有 32、321 这两个数字。

  1. 如果用 x > y 比较,即先比较再拼接,则 321 > 32,拼接后为 32132,但是显然 32132 < 32321,所以这样比较不对。

  2. 如果用 x + y > y + x 比较,即先拼接再比较,则 32321 > 32132,正确。

所以,对于两个字符串 x 和 y,如果 x+y 的字典序大于 y+x 的字典序,则认为 x 大于 y。得到比较函数 cmp 如下。

cpp 复制代码
bool cmp(string x, string y)
{
    return x + y > y + x;
}

AC代码

cpp 复制代码
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#define AUTHOR "HEX9CF"
using namespace std;

const int N = 107;

int n;
string s[N];

bool cmp(string x, string y)
{
    return x + y > y + x;
}

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> s[i];
    }
    sort(s + 1, s + n + 1, cmp);
    for (int i = 1; i <= n; i++)
    {
        cout << s[i];
    }
    cout << endl;
    return 0;
}
相关推荐
Dola_Pan43 分钟前
C++算法和竞赛:哈希算法、动态规划DP算法、贪心算法、博弈算法
c++·算法·哈希算法
小林熬夜学编程1 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
阿洵Rain2 小时前
【C++】哈希
数据结构·c++·算法·list·哈希算法
姜西西_2 小时前
动态规划 之 斐波那契数列模型 算法专题
算法·动态规划
格里菲斯8582 小时前
算法练习记录
算法
阿芯爱编程2 小时前
平衡二叉树
java·后端·算法
幼儿园园霸柒柒3 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
忘梓.3 小时前
排序的秘密(1)——排序简介以及插入排序
数据结构·c++·算法·排序算法
福大大架构师每日一题3 小时前
文心一言 VS 讯飞星火 VS chatgpt (384)-- 算法导论24.5 4题
算法·文心一言
云卓科技3 小时前
无人车之路径规划篇
人工智能·嵌入式硬件·算法·自动驾驶