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: - M E X ( { 0 } ) = 1 MEX(\{0\})=1 MEX({0})=1
- M E X ( { 0 , 1 } ) = 2 MEX(\{0,1\})=2 MEX({0,1})=2
- M E X ( { 0 , 1 , 2 } ) = 3 MEX(\{0,1,2\})=3 MEX({0,1,2})=3
- M E X ( { 0 , 1 , 2 , 3 } ) = 4 MEX(\{0,1,2,3\})=4 MEX({0,1,2,3})=4
- M E X ( { 0 , 1 , 2 , 3 , 4 } ) = 5 MEX(\{0,1,2,3,4\})=5 MEX({0,1,2,3,4})=5
- 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
- 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,a2⋅⋅⋅⋅ai},它的值表示的是 a 1 , a 2 ⋅ ⋅ ⋅ ⋅ a i a_1,a_2····a_i a1,a2⋅⋅⋅⋅ai这段前缀未出现的最小非负整数。那么给你一个大小为 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;
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号