[题解] #5914.【例71.3】 拼最大整数 审核通过

cq_irritater 2025-06-25 14:12:39 9

题目知识点

字符串+贪心

题意说明

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

问题分析

拿到这道题,首先自然会想到大的字符串应该排在前面,因为如果 是两个由数字字符构成的字符串,且 ,一般情况下有 的情况。如 ,则 ,所以

为了解决这些问题,根据题意引进另一种字符串比较方法,将 相比较,如果前者大于后者,则认为 。按这一定义将所有的数字字符串从大到小排序后连接起来所得到的数字字符串即是这个问题的解。排序时先将所有字符串中的最大值选出来存在数组的第一个元素中,再从第二到最后的一个元素中最大的字符串选出来存在第二个元素中,直到最后的两个元素中选出最大的字符串存在数组的倒数第二个元素为止。

代码

#include <bits/stdc++.h>

using namespace std;

struct num
{
    int a, b;
} c[21];

int n;

int a(int x, int y) // x ^ y
{
    if (y == 0)
    {
        return 1;
    }
    if (y == 1)
    {
        return x;
    }
    int z;
    z = a(x, y / 2); // 这里可以和上面合并写作:int z=a(x,y/2);
    if (y % 2 == 1)
    {
        return z * z * x;
    }
    else
    {
        return z * z;
    }
}

bool abc(num x, num y)
{
    int w, p;
    w = x.a * y.b + y.a;
    p = y.a * x.b + x.a;
    return w > p;
}

int main()
{
    // freopen("code.in", "r", stdin);
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &c[i].a);
        c[i].b = 0;
        int x;
        x = c[i].a; // 这里可以和上面合并写作:int x = c[i].a;
        while (x)
        {
            x /= 10;
            c[i].b++;
        }
        c[i].b = a(10, c[i].b);
    }
    sort(c + 1, c + n + 1, abc);
    for (int i = 1; i <= n; i++)
    {
        printf("%d", c[i].a);
    }
    return 0;
}

{{ vote && vote.total.up }}