W
e
l
c
o
m
e
: )

题解:CF381B Sereja and Stairs

题意

给定 \(m\) 个元素的序列 \(b\)

取若干 \(b\) 中元素组成新序列 \(a\) 使得 \(a_1<a_2<a_3<\dotsc<a_{i-1}<a_i>a_{i+1}>\dotsc>a_{|a|-1}>a_{|a|}\)

给出一种使得 \(|a|\) 最大的方案。

分析

考虑贪心。

先从小到大取数,然后再从大到小取。

关注到值域很小(\(b_i\leq5\times10^3\)),考虑用桶维护每个数出现的次数。

最后注意一下最大数不能重复选取。

Code

#include<bits/stdc++.h>
using namespace std;
#define maxn 5003

int cnt[maxn];
vector<int> ans;

int main()
{
    int n;
    cin>>n;
    for(int i=1, t;i<=n;i++)
        cin>>t, cnt[t]++;
    for(int i=1;i<maxn;i++)
        if(cnt[i]) cnt[ans.emplace_back(i)]--;
    for(int i=maxn;i;i--)
        if(cnt[i]&&i!=ans.back()) ans.emplace_back(i);
    cout<<ans.size()<<'\n';
    for(auto i:ans) cout<<i<<' ';    
}
posted @ 2024-08-25 21:00  Jimmy-LEEE  阅读(15)  评论(0)    收藏  举报