题解: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<<' ';
}

浙公网安备 33010602011771号