分隔相同整数
时间限制: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; }