Codeforces 1419D1. D1. Sage's Birthday (easy version)
原题链接
简单
作者:
蓬蒿人
,
2022-03-20 21:48:54
,
所有人可见
,
阅读 226
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
//1419D1
//题目大意
//给定一个n 以及n个数 1<=n<=1e5
//问如何排列使得 a[i-1]>a[i]&&a[i]<a[i+!]的情况最多
//输出 满足条件的a[i]的个数 并输出排列后的数组
/*------------------------题目大意------------------*/
// 如果把最后的数组折线图来表示 那么就是一个上升的波形图
// 满足条件的a[i]的个数 就是谷底的个数=n%2?n/2:(n-1)/2;
// 排个序 开个数组存数 第一个谷底放最小的 第二个谷底放第二小的...
// 谷底放完后开始依次放谷峰
// 放完后进行判定再输出
const int N = 1e5+10;
int n,a[N];
int main(){
scanf("%d", &n);
for (int i=1;i<=n;i++) scanf ("%d",&a[i]);
sort(a+1,a+1+n);
int t[N];
int u=n%2?n/2:(n-1)/2;
//求出n能拥有的谷底上限
for (int i=1;i<=n;i++){
if (i%2) t[i]=a[u+i/2+1];
else if (i%2==0&&i/2<=u)t[i]=a[i/2];
else t[i]=a[i];
}
int ans=0;
for (int i=2;i<=n;i+=2){
if (t[i]<t[i-1]&&t[i]<t[i+1]) ans++;
}
cout<<ans<<'\n';
for (int i=1;i<=n;i++){
cout<<t[i]<<' ';
}
return 0;
}