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

· · 题解

题目难理解,通过梳理可知

给定 09 每个数字的出现次数,你需要构造一个数,前一个下标不大于后一个下标的数对、拼接起来的数相加的和最大。

思路:

首先统计每个数的个数,再进行降序排列,最大位在前,最小位在后,最后输出排列后的数组即可

AC Code

# include <bits/stdc++.h>
using namespace std;
bool cmp1(int x,int y) {
    return 10*x+y>10*y+x;//比较
}
int a[501];
int main() {
    int x,ans=0;
    for(int i=1;i<=10;i++){
        cin>>x;
        for(int j=1;j<=x;j++) a[ans++]=i-1;//注意i要减一,不然WA
    }
    sort(a,a+ans,cmp1);//排序
    for(int i=0;i<ans;i++) cout<<a[i]<<' ';//输出
    return 0;
}