分隔相同整数

分隔相同整数

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定一个包含N个整数的数组A。你的任务是将A重新排列,使得任意两个相等的整数在数组中都不相邻。  

如果存在多个重排后的数组满足条件,输出字典序最小的数组。  

这里字典序最小指:首先尽量使第一个整数最小,其次使第二个整数最小,以此类推。

输入

第一行包含一个整数N,表示数组的长度。(1 <= N <= 100000)  

第二行包含N个整数,依次是 A1, A2, ... AN。(1 <= Ai <= 1000000000)

输出

输出字典序最小的重排数组。如果这样的数组不存在,输出-1。

样例输入
4  
2 1 3 3
样例输出
   1 3 2 3
分析:转自http://www.gotit.sinaapp.com/author/ictlxb.html(ictlxb)
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#include <bitset>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define vi vector<int>
#define pii pair<int,int>
#define mod 1000000007
#define inf 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
const int maxn=1e5+10;
const int dis[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
using namespace std;
ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
int n,m,k,t,pre;
set<pii> st;
map<int,int>::iterator iter;
map<int,int> a;
vector<int> ans;
int main()
{
    int i,j;
    scanf("%d",&n);
    rep(i,1,n)scanf("%d",&j),++a[j];
    for(pii x:a)st.insert(mp(x.se,x.fi));
    pre=-1;
    while(n)
    {
        iter=a.find(st.rbegin()->se);
        if(iter->se*2-1>=n)
        {
            if(iter->fi==pre)
                return 0*puts("-1");
        }
        else
        {
            iter=a.begin();
            if(iter->fi==pre)iter++;
        }
        ans.pb(iter->fi);
        pre=iter->fi;
        st.erase(mp(iter->se,iter->fi));
        iter->se--;
        if(iter->se==0)a.erase(iter);
        else st.insert(mp(iter->se,iter->fi));
        n--;
    }
    printf("%d",ans[0]);
    rep(i,1,ans.size()-1)printf(" %d",ans[i]);
    printf("
");
    //system ("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/dyzll/p/5752866.html