Codeforces Round #671 D Sage‘s Birthday (模拟构造)

题意:给n个数,要求将这n个数重新排列使得凹进去的数(就是比两边都小的数)最多

分析:思考后可以发现,无论是奇数还是偶数,无论中间有多少相同的数,只要把前(n-1)/2个数全部按顺序紧紧塞到后面(如果是偶数第一个后不塞,就可以保证凹进去的数最多,比较好证明,所以只需要用这种方式构造出来目标数组,然后算下有几个满足条件的数就好了

代码:

#include <cmath> //定义数学函数
#include <cstdio> //定义输入/输出函数
#include <cstdlib> //定义杂项函数及内存分配函数
#include <cstring> //字符串处理
#include <algorithm> //STL 通用算法
#include <cmath>
#include <list> //STL 线性列表容器
#include <map> //STL 映射容器
#include <iostream>
#include <queue> //STL 队列容器
#include <set> //STL 集合容器#
#include <stack> //STL 堆栈容器
#include <string> //字符串类
#include <vector> //STL 动态数组容器
#define x first
#define y second
#define mid (l+r>>1)
#define lo (o<<1)
#define ro (o<<1|1)
using namespace std;
typedef long long ll;
typedef vector<int>vi;
typedef pair<int,int>pii;
struct tri{int x,y,z;};
const int inf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
const int N=1e5+10;
const ll mod=998244353;
const double PI=acos(0)*2;
int n,arr[N];
vi v;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
//    freopen("in.txt","r",stdin);
    cin>>n;
    for(int i=1;i<=n;i++)cin>>arr[i];
    sort(arr+1,arr+1+n);
    if(n&1^1)v.push_back(arr[n/2]);//偶数时把右边第一个先塞进来
    for(int i=1;i<=(n-1)/2;i++)//计算出无论奇偶都是前(n-1)/2个
    {
        v.push_back(arr[n/2+i]);
        v.push_back(arr[i]);
    }
    v.push_back(arr[n]);
    int ans=0;
    for(int i=1;i<v.size()-1;i++)
        if(v[i-1]>v[i]&&v[i]<v[i+1])ans++;
    cout<<ans<<endl;
    for(auto i:v)cout<<i<<' ';
    return 0;
}

 

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页