题解:CF381B Sereja and Stairs

题意

给定 m 个元素的序列 b

取若干 b 中元素组成新序列 a 使得 a1<a2<a3<<ai1<ai>ai+1>>a|a|1>a|a|

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

分析

考虑贪心。

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

关注到值域很小(bi5×103),考虑用桶维护每个数出现的次数。

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

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<<' ';
}

本文作者:Jimmy-LEEE

本文链接:https://www.cnblogs.com/redacted-area/p/18379543

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Jimmy-LEEE  阅读(3)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起