###题目链接###

题目大意:有 n 个正整数,每个正整数代表一个成语,正整数一样则成语相同。同一个正整数最多只会出现 3 次。

求一种排列,使得这个排列中,相同成语的间隔最小值最大,输出这个最小间隔的最大值。

相同成语的间隔为这两者中间的成语个数。

特别地,当每种成语都只出现一次时,把最小间隔的最大值视为 n 。

分析:

1、若成语最大出现的次数是 2 时:比如有两个不同的成语 1  2 ,他们都出现过两次,那么为了使得最小间隔要最大,最好的构造就是两个 1 的间隔等于两个 2 的间隔。

1    2     X X X X X    1    2        ( X 代表别的成语)

这样就可以使得出现过两次的成语,他们的间隔都相同了,不会有哪一个更小。那么设 res = 只出现一次的成语个数,设 a = 出现为两次的成语种类数。

则 res = n - 2 * a ,答案就是:res + (a - 1)

2、那么对于成语没有出现次数为 2 ,有出现次数为 3 时,也可以这样构造。

1  2  3     X X X    1  2  3   X X     1  2  3

这样你会发现,1 2 3 这三个成语的最小间隔都一样,那由于这里 X 为奇数(X=5),分占两边则必有一边更少,那么少的这一边就是最小间隔了。

设 res = 出现一次的成语个数,a = 出现三次的成语种类数。则 res = n - 3 * a,答案就是:res + (a - 1)。

3、那么对于既有两次的又有三次出现的成语,也可以用上面的思想构造:

由于为了使最小间隔最大,而对于出现三次的成语,最好是一个在最左一个在最右,一个在最中间。而对于出现两次的成语,由于没有 “中间第三个成语”的限制,那么为了加大出现三次的成语的间隔数,最好的方法就是先最左最右排完出现三次的成语,然后才排出现两次的成语。

比如这有出现三次的:1  2  3,出现两次的  4  5 。

1  2  3   4  5           XX     1  2  3           X X X        4  5   1  2  3

这样可以最大限度的保证最小间隔尽量小且 1 与 1 ,2 与 2 ,3与 3 的最小间隔相同(对于成语出现两次的也是一样的,它们间隔都相同)

但这里有个极限想法:如果出现两次的成语个数很多,导致它们一直往中间靠拢,可能会使某个出现两次的成语的间隔会小于出现三次的成语的间隔,则同时求出来然后去 min 即可。

设 res = 出现一次的成语个数,x = 出现两次的成语种类数,y = 出现三次的成语种类数。

则有:res = n - 2 * x - 3 * y,答案为:min(res + y + x - 1, res / 2 + x + y - 1)

hhh 然后这个 min 其实没用,可以从公式中看出,右边(成语出现为三次的最小间隔)一定会小于左边(成语出现为两次的最小间隔)。

然后由于数据太大,记录成语出现的次数除非开 map  或 离散化。

代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[],b[],c[], vis[];
int main()
{
scanf("%d", &n);
for (int i = ; i <= n; i++){
scanf("%d", &a[i]);
b[i] = a[i];
}
sort(b + , b + n + );
int len = unique(b + , b + n + ) - b - ;
for (int i = ; i <= n; i++) c[i] = lower_bound(b + , b + len + , a[i]) - b, vis[c[i]] ++;//离散化
int x = , y = ;
for (int i = ; i <= len; i++){
if (vis[i] == ) x++;
else if (vis[i] == ) y++;
}
int res, ans;
if ((!x) && (!y)){
ans = n;
}
else if (x&&(!y)){
res = n - * x;
ans = res + x - ;
}
else if ((!x)&&y){
res = (n - * y) / ;
ans = res + y - ;
}
else{
res = n - * x - * y;
//ans = min(res + y + x - 1, res / 2 + x + y - 1);
ans=res / + x + y - ;
}
printf("%d\n", ans);
}

Comet OJ - Contest #10 B题 沉鱼落雁的更多相关文章

  1. Comet OJ - Contest #10 C题 鱼跃龙门

    ###题目链接### 题目大意: 给你一个 x ,让你求出最小的正整数 n 使得 n * (n + 1) / 2  % x == 0 ,即 n * (n + 1)  % 2x == 0 . 分析: 1 ...

  2. Comet OJ - Contest #4 B题 奇偶性

    题目链接:https://www.cometoj.com/contest/39/problem/B?problem_id=1577 题意:给你一个数列,求L 到 R 区间内 所有数列 (ƒn mod ...

  3. Comet OJ - Contest #10 C.鱼跃龙门

    传送门 题意: 求最小的\(x\),满足\(\frac{x(x+1)}{2}\% n=0,n\leq 10^{12}\). 多组数据,\(T\leq 100\). 思路: 直接考虑模运算似乎涉及到二次 ...

  4. Comet OJ - Contest #10 鱼跃龙门 exgcd+推导

    考试的时候推出来了,但是忘了 $exgcd$ 咋求,成功爆蛋~ 这里给出一个求最小正整数解的模板: ll solve(ll A,ll B,ll C) { ll x,y,g,b,ans; gcd = e ...

  5. Comet OJ - Contest #0 A题 解方程 (数学)

    题目描述 小象同学在初等教育时期遇到了一个复杂的数学题,题目是这样的: 给定自然数 nn,确定关于 x, y, zx,y,z 的不定方程 \displaystyle \sqrt{x - \sqrt{n ...

  6. Comet OJ - Contest #2 C题 言论的阴影里妄想初萌

    题目描述 Takuru 是一名能力者,他在地震时获得了念力致动的能力.所以他经常用自己的能力去干一些奇奇怪怪的事情. 有一天他获得了一张 nn 个点的无向完全图,之后他使用了能力,导致这张图的 \fr ...

  7. Comet OJ - Contest #11 B题 usiness

    ###题目链接### 题目大意:一开始手上有 0 个节点,有 n 天抉择,m 种方案,在每天中可以选择任意种方案.任意次地花费 x 个节点(手上的节点数不能为负),使得在 n 天结束后,获得 y 个节 ...

  8. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  9. Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」

    来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...

随机推荐

  1. CSS预处理器之less和sass

    CSS预处理器 1.        基于CSS的另一种语言 2.        通过工具编译成CSS 3.        添加了很多CSS不具备的特性 4.        能提升CSS文件的组织方式 ...

  2. 稳定易用的 Django 分页库,完善分页功能

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在 通过 Django Pagination 实现简单分页 中,我们实现了一个简单的 ...

  3. Django day03之学习知识点

    今日是路由层学习: 3.路由匹配 3.1 正则表达式的特点: 一旦正则表达式能够匹配到内容,会立刻结束匹配关系 直接执行对应的函数.相当于采用就近原则,一旦找到就不再继续往下走了 重点: 正则表达式开 ...

  4. 基于TCP协议之socket编程

    #服务端 #导入一个socket模块 import socket #想象成买手机打电话:socket.SOCK_STREAM 表示建立tcp连接 ,udp连接socket.SOCK_DGRAM #买了 ...

  5. AQS系列(四)- ReentrantReadWriteLock读写锁的释放锁

    前言 继续JUC包中ReentrantReadWriteLock的学习,今天学习释放锁. 一.写锁释放锁 入口方法 public void unlock() { sync.release(1); } ...

  6. 利用PyCharm操作Github(二):分支新建、切换、合并、删除

      在文章利用PyCharm操作Github:仓库新建.更新,代码回滚中,我们已经学习到了如何利用PyCharm来操作Github,其中包括了一些常见的Github操作:仓库的新建.更新以及代码回滚. ...

  7. 网易极客战记官方攻略-地牢-Kithgard 图书管理员

    关卡连接: https://codecombat.163.com/play/level/kithgard-librarian 向友好的图书馆管理员求助! 简介 大多数关卡都有提示,在你卡关时挺有用. ...

  8. 百度大脑UNIT3.0解读之对话式文档问答——上传文档获取对话能力

    在日常生活中,用户会经常碰到很多复杂的规章制度.规则条款.比如:乘坐飞机时,能不能带宠物上飞机,3岁小朋友是否需要买票等.在工作中,也会面对公司多样的规定制度和报销政策.比如:商业保险理赔需要什么材料 ...

  9. webpack 使用style-loader,css-loader添加css样式

    // 注意:webpack 默认只能打包处理js类型的文件// 如果要处理非js类型文件,需要手动安装第三方加载器// 1安装npm install style-loader css-loader - ...

  10. flyway 非常坑爹的中文乱码问题

    flyway 也真是够了, 动不动乱码,烦死了! 我的 命令是这样的: flyway  -driver=com.mysql.jdbc.Driver -user=root -password=12345 ...