<span>hihocoder1356 分隔相同整数</span>
题意:
给你一个序列,让你重新排序,相邻不能相同,且输出字典序最小的
如果不行输出-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; }