题意:

给你一个序列,让你重新排序,相邻不能相同,且输出字典序最小的

如果不行输出-1

思路:

用map存储每个数字出现的次数

用set的排序选出次数多的数字

然后如果当前数字必须要填了就填上,否则填尽可能小的那个

/* ***********************************************
Author        :devil
************************************************ */
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <stdlib.h>
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const int mod=998244353;
const int N=1e5+10;
int n,a[N];
map<int,int>mp;
map<int,int>::iterator it;
set<pair<int,int> >s;
vector<int>v;
int main()
{
    //freopen("in.txt","r",stdin);
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        mp[a[i]]++;
    }
    for(it=mp.begin();it!=mp.end();it++)
        s.insert(make_pair(it->second,it->first));
    if((--s.end())->first*2-1>n) printf("-1\n");
    else
    {
        int pre=-1;
        for(int i=1;i<=n;i++)
        {
            int x;
            if((--s.end())->first*2-1==(n+1-i)) x=(--s.end())->second;
            else
            {
                it=mp.begin();
                if(it->first==pre) it++;
                x=it->first;
            }
            s.erase(make_pair(mp[x],x));
            if(--mp[x]>0) s.insert(make_pair(mp[x],x));
            else mp.erase(x);
            printf("%d%c",x,i==n?'\n':' ');
            pre=x;
        }
    }
    return 0;
}