Codeforces Round #708 (Div. 2) A.Meximization 思维

在这里插入图片描述

  • 测试样例

    input
    3
    7
    4 2 0 1 3 3 7
    5
    2 2 8 6 9
    1
    0
    output
    0 1 2 3 4 7 3
    2 6 8 9 2
    0

  • Note

    In the first test case in the answer M E X MEX MEX for prefixes will be:

    1. M E X ( { 0 } ) = 1 MEX(\{0\})=1 MEX({0})=1
    2. M E X ( { 0 , 1 } ) = 2 MEX(\{0,1\})=2 MEX({0,1})=2
    3. M E X ( { 0 , 1 , 2 } ) = 3 MEX(\{0,1,2\})=3 MEX({0,1,2})=3
    4. M E X ( { 0 , 1 , 2 , 3 } ) = 4 MEX(\{0,1,2,3\})=4 MEX({0,1,2,3})=4
    5. M E X ( { 0 , 1 , 2 , 3 , 4 } ) = 5 MEX(\{0,1,2,3,4\})=5 MEX({0,1,2,3,4})=5
    6. M E X ( { 0 , 1 , 2 , 3 , 4 , 7 } ) = 5 MEX(\{0,1,2,3,4,7\})=5 MEX({0,1,2,3,4,7})=5
    7. M E X ( { 0 , 1 , 2 , 3 , 4 , 7 , 3 } ) = 5 MEX(\{0,1,2,3,4,7,3\})=5 MEX({0,1,2,3,4,7,3})=5

    The sum of M E X = 1 + 2 + 3 + 4 + 5 + 5 + 5 = 25 MEX=1+2+3+4+5+5+5=25 MEX=1+2+3+4+5+5+5=25. It can be proven, that it is a maximum possible sum of MEX on prefixes

  • 题目大意:我们先来解释一下 M E X { a 1 , a 2 ⋅ ⋅ ⋅ ⋅ a i } MEX\{a_1,a_2····a_i\} MEX{a1,a2ai},它的值表示的是 a 1 , a 2 ⋅ ⋅ ⋅ ⋅ a i a_1,a_2····a_i a1,a2ai这段前缀未出现的最小非负整数。那么给你一个大小为 n n n的数组 a a a,需要你重新构造数组,使得数组 a a a的前缀进行 M E X MEX MEX运算之和的值最大,即: ∑ i = 1 n M E X ( b 1 , b 2 , … , b i ) \sum_{i=1}^nMEX(b1,b2,…,bi) i=1nMEX(b1,b2,,bi),使这个值最大。

  • 解题思路
    对于这道题,我们必须要把 M E X MEX MEX给弄清楚了,怎么样使得其值最大,是不是依次将小的数填完,这样之后得到的运算结果是未出现的最小非负整数。所以我们可以对数组 a a a中的元素按唯一升序排列,这样我们可以保证计算的 M E X MEX MEX是最大的,同样排完这些之后我们再将重复的元素按任意顺序放置,因为此时 M E X MEX MEX不会再改变了,我们这样求得的 M E X MEX MEX之和即是最大值。

  • 代码

/**
* @filename:C.cbp
* @Author : pursuit
* @Blog:unique_pursuit
* @email: 2825841950@qq.com
* @Date : 2021-03-17-22.33.47
*/
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn=1e5+5;
const int mod=1e9+7;

int t,n;
void solve(){
    vector<int> a(n);
    vector<int> b;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a.begin(),a.end());
    for(int i=0;i<n;i++){
        if(i==0||a[i]!=a[i-1]){
            b.emplace_back(a[i]);
        }
    }
    for(int i=1;i<n;i++){
        if(a[i]==a[i-1]){
            b.emplace_back(a[i]);
        }
    }
    for(int i=0;i<n;i++){
        cout<<b[i];
        i==n-1?cout<<endl:cout<<" ";
    }
}
int main(){
    while(cin>>t){
        while(t--){
            cin>>n;
            solve();
        }
    }
    return 0;
}

posted @   unique_pursuit  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示