题解:P15063 [UOI 2024 II Stage] Creating an Array

· · 题解

题目大意

给定 09 每个数字的出现次数,用这些数字组成一个数组,要求让所有位置满足前一个下标不大于后一个下标的数对,拼接起来的数相加的和最大,输出任意一个符合要求的数组就行。

思路

两个数字 xy 谁放前面能让拼接数更大,谁就排在前。把所有数字按这个规则从左到右排,最终数组的拼接和就是最大的。

代码


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 自定义排序规则:x拼接y 大于 y拼接x 则x在前
bool cmp(int x, int y) {
    return 10 * x + y > 10 * y + x;
}

int main() {
    int c[10];
    vector<int> nums;
    // 读取0-9每个数字的出现次数
    for (int i = 0; i < 10; ++i) {
        cin >> c[i];
        // 按次数生成数字数组
        for (int j = 0; j < c[i]; ++j) {
            nums.push_back(i);
        }
    }
    // 按自定义规则排序
    sort(nums.begin(), nums.end(), cmp);
    // 输出结果
    for (int i = 0; i < nums.size(); ++i) {
        if (i > 0) cout << " ";
        cout << nums[i];
    }
    return 0;
}