分析:考虑贪心,考虑填ans[i],前i-1个合法,现在剩下一些数,

那么挑出出现次数最多的数,次数为mx,当前剩余总数为sum

如果sum-mx>=mx-1那么肯定有解,这个想想就知道了(这种题做过无数遍了)

考虑当前填的数,如果sum-mx=mx-1,那么只能填出现次数最多的数

否则,贪心选择和ans[i-1]不一样且最小的,因为求字典序,所以每次贪心是对的

#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <set>
#include <queue>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 1e5+;
const int INF = 0x3f3f3f3f;
typedef pair<int,int>pii;
int a[N],n,p[N],c[N],tot;
set<pii>s;
set<pii>::iterator it;
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i)
scanf("%d",&a[i]);
sort(a+,a++n);
for(int i=;i<=n;++i){
int cnt=;
while(i+<=n&&a[i+]==a[i])++i,++cnt;
s.insert(make_pair(cnt,a[i]));
++tot;p[tot]=a[i];c[tot]=cnt;
}
int j=;
bool flag=;
for(int i=;i<=n;++i){
it=s.end();--it;
int cur=n-i+,mxcnt=it->first;
if(cur-mxcnt<mxcnt-){
printf("-1\n");
return ;
}
if(cur-mxcnt>mxcnt-){
while(j<=tot&&c[j]==)++j;
int k=j;
for(;k<=tot;++k){
if(c[k]&&p[k]!=a[i-])break;
}
if(k==tot+){
printf("-1\n");
return ;
}
pii tmp=make_pair(c[k],p[k]);
s.erase(tmp);
a[i]=p[k];
--c[k];
if(c[k]) s.insert(make_pair(c[k],p[k]));
}
else{
a[i]=it->second;
int pos=lower_bound(p+,p++tot,a[i])-p;
--c[pos];
s.erase(it);
if(c[pos])
s.insert(make_pair(c[pos],p[pos]));
}
}
for(int i=;i<n;++i)printf("%d ",a[i]);
printf("%d\n",a[n]);
return ;
}

hihocoder 1356 分隔相同整数 简单贪心的更多相关文章

  1. hihocoder 1356 分隔相同整数

    时间限制:10000ms单点时限:1000ms内存限制:256MB 描述 给定一个包含N个整数的数组A.你的任务是将A重新排列,使得任意两个相等的整数在数组中都不相邻. 如果存在多个重排后的数组满足条 ...

  2. ACM_发工资(简单贪心)

    发工资咯: Time Limit: 2000/1000ms (Java/Others) Problem Description: 作为广财大的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日 ...

  3. CF 628C --- Bear and String Distance --- 简单贪心

    CF 628C 题目大意:给定一个长度为n(n < 10^5)的只含小写字母的字符串,以及一个数d,定义字符的dis--dis(ch1, ch2)为两个字符之差, 两个串的dis为各个位置上字符 ...

  4. Uva 11729 Commando War (简单贪心)

    Uva 11729  Commando War (简单贪心) There is a war and it doesn't look very promising for your country. N ...

  5. CDOJ 1502 string(简单贪心)

    题目大意:原题链接 相邻两个字母如果不同,则可以结合为前一个字母,如ac可结合为a.现给定一个字符串,问结合后最短可以剩下多少个字符串 解体思路:简单贪心 一开始读题时,就联想到之前做过的一道题,从后 ...

  6. ACM_Ruin of Titanic(简单贪心)

    Ruin of Titanic Time Limit: 2000/1000ms (Java/Others) Problem Description: 看完Titanic后,小G做了一个梦.梦见当泰坦尼 ...

  7. hdu 2037简单贪心--活动安排问题

    活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动 ...

  8. ACM_ICPC hdu-2111(简单贪心算法)

    一道非常简单的贪心算法,但是要注意输入的价值是单位体积的价值,并不是这个物品的总价值!#include <iostream> #include <stdio.h> #inclu ...

  9. hihoCoder 1051补提交卡(贪心 枚举)

    http://hihocoder.com/problemset/problem/1051 既然要选择最长连续提交天数,那么提交卡必须连续使用才有可能得到最优解,这样贪心,然后从头到尾扫一遍求出最大值. ...

随机推荐

  1. 拥有更好性能的requesAnimationFrame(Better Performance with requestAnimationFrame)

    介绍: 这篇文章讨论的是你可以(也应该)学习通过使用requestAnimationFrame API,而不是使用之前的setInterval/setTimeout方法,来提高动画的性能:如何使用re ...

  2. Java:异常的处理

    异常分两种大的异常类型,运行时异常和受检查异常. 用户既可以使用系统的异常类来处理异常信息,也可以创建系统的异常类的子类来自定义异常,这种方式比较灵活,虚拟机可以报出自己设置的异常信息,清楚明白. 1 ...

  3. WebMvcConfigurerAdapter

    spring Boot 默认的处理方式就已经足够了,默认情况下Spring Boot 使用WebMvcAutoConfiguration中配置的各种属性. 建议使用Spring Boot 默认处理方式 ...

  4. CentOS 快速安装pip

    python的很多组件都必须依靠pip来安装,比如elasticsearch驱动.postgres驱动 Python2.7以后的版本自带pip,centos6.5之前yum自带的python为2.6, ...

  5. 《Java编程那点事儿》读书笔记(六)——异常处理

    1.抛出异常:throw 异常对象; 下面的代码是一个进制转换代码,可以转换为2进制和8进制,如果输入其他参数,则抛出异常. public static String transform(int va ...

  6. Ubuntu 14.10下安装深度音乐客户端

    很多刚从windows系统投靠到ubuntu的机油,在听音乐时不是很舒心.毕竟ubuntu软件中心的很多影音软件都是国外的朋友编写的,所以很多时候国内的朋友用着很不舒服.今天给大家推荐的是国内开发者针 ...

  7. Java面试汇总

    转自:http://zy19982004.iteye.com/blog/1846537#comments 一.All 最近找工作,遇到的笔试面试题,归纳如下,供大家参考. 二.J2SE 容器 Hash ...

  8. python3代码

    import urllib.request url="http://mm.taobao.com/json/request_top_list.htm?type=0&page=1&quo ...

  9. Codeforces Round #362 (Div. 2) A.B.C

    A. Pineapple Incident time limit per test 1 second memory limit per test 256 megabytes input standar ...

  10. Remember that ordinal parameters are 1-based!

    问题发生的原因是:hql语句里不需要参数,却添加了一个参数,删掉添加参数的语句就可以了!