题目描述:

链接:https://ac.nowcoder.com/acm/contest/3402/E
来源:牛客网

数据已修改,比赛时的所有提交已经进行了rejudge。

假面骑士要过河,恰好河的两岸间有N(0 ≤ N ≤ 50,000)块石头在同一条直线上。他已经知道了河的宽度L(1 ≤ L ≤ 1,000,000,000)和每一块石头离假面骑士所在河岸的距离Di(0 < Di < L),石头不会发生重叠。

可是假面骑士在与怪物的激烈战斗之后,留下了后遗症。他不能忍受跨越任何一块石头,所以他只能一块一块地按距离顺序踩着石头过河。皮卡丘是他的好朋友,皮卡丘为了帮助他,已经使用十万伏特去掉了M (0 ≤ M ≤ N)块石头,不过皮卡丘没有告诉假面骑士到底去掉了哪些位置的石头。

假面骑士想知道在过河的过程中,他需要跨越的最小距离最大可能是多少。

输入描述:

有多组测试,保证 ∑ N i ≤ 5 ∗ 1 0 6 \sum N_i \leq 5*10^6 ∑Ni​≤5∗106;
每个测试的第一行是河的宽度L,石头总数N,被消灭石头的个数M
第二行有N个数,表示每块石头到假面骑士所在河岸的距离

输出描述:

输出在所有可能的情况下,需要跨越的最小距离最大可能是多少

输入样例:

5 2 1
3 4
25 5 2
2 14 11 21 17

输出样例:

2
4

核心思想:

二分距离,对于每一个距离x:
以cnt记录被删除石头的数目,
先自近向远遍历,如果石头i和上一个被保留下的石头的距离不小于x,则石头i可以被保留,否则删掉。
再自远向近遍历,如果石头i与目的河岸的距离小于x,则删除石头i,否则遍历结束。
若cnt不大于m,则x可行,否则x不可行,分情况缩小二分区间。

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=5e4+20;
int d,n,m,a[N],b[N];//a存原数组,b存保留下的数
bool fun(int x)
{int p=0,cnt=0;b[p++]=0;for(int i=1;i<=n&&cnt<=m;i++)//自近向远选数 if(a[i]-b[p-1]<x) cnt++;else b[p++]=a[i];if(cnt>m) return 0;for(int i=p-1;i>0&&d-b[i]<x;i--,cnt++);//自远向近删数 if(cnt>m) return 0;return 1;
}
int main()
{while(cin>>d>>n>>m){for(int i=1;i<=n;i++) scanf("%d",&a[i]);sort(a+1,a+n+1);//a数组原本是乱序的 int l=0,r=d,ans=0;while(l<=r){int mid=(l+r)>>1;if(fun(mid)) ans=mid,l=mid+1;else r=mid-1;}printf("%d\n",ans);}return 0;
}

牛客3402E-一步两步是魔鬼的步伐-二分相关推荐

  1. 牛客题霸 [合并两个有序的数组] C++题解/答案

    牛客题霸 [合并两个有序的数组] C++题解/答案 题目描述 给出两个有序的整数数组 和 ,请将数组 合并到数组 中,变成一个有序的数组 注意: 可以假设 数组有足够的空间存放 数组的元素, 和 中初 ...

  2. Python 斐波那契/跳台阶一步两步/跳台阶多种步法/配零钱

    Python3.6.3 跳台阶一步两步 1.  跳n(n∈N)阶台阶过程中最多有 n//2 步是跳了2阶,2阶步数固定的情况下可以用 C(总步数, 2阶的步数) 求出方法数,再把所有情况都加起来即可. ...

  3. [C++] 牛客网:合并两个有序的数组

    主要是体验一下牛客网里的核心代码模式到底是怎么弄的..还有C++这个东西平常用的太少了,试一试. 以外的还体验到了sort()函数的使用. 来源:牛客网 题目链接:合并两个有序的数组 知识点:数组.双 ...

  4. 牛客小白月赛17 F小黄鸭(计算几何+积分+二分)

    链接:https://ac.nowcoder.com/acm/contest/1085/F 来源:牛客网 题目描述 小sun的寝室有一只小黄鸭,小黄鸭浮在水面上的样子特别可爱,现在小sun有一个问题: ...

  5. 牛客网oi测试赛E旅行青蛙【LIS二分】

    链接:https://www.nowcoder.com/acm/contest/181/E 来源:牛客网 题目描述 一只青蛙出去旅游,因为中国有一句古话说的好:"由简入奢易,由奢入俭难&qu ...

  6. 牛客3007E-立方数-欧拉线性筛+素数分解+二分

    链接:https://ac.nowcoder.com/acm/contest/3007/E 来源:牛客网 题目描述: 对于给定的正整数 N,求最大的正整数 A,使得存在正整数 B,满足 A3B=N 输 ...

  7. 极客DIY:只用两步教你制作一款可编程键盘 [译]

    原文出处:  Freebuf黑客与极客 对于那些工作时需要与许多组合键打交道的人(比如经常使用Photoshop的人)来说,一款可编程键盘无疑是十分实用的.本期的DIY将为大家带来一款可编程键盘,其制 ...

  8. github的python代码怎么跑_python程序员一步两步教你使用GitHub!

    作为一个Python爬虫师一步步教你们怎么把代码放入到github 中! 首先呢我们下载一个git的客户端 学习Python中有不明白推荐加入交流群号: 前面548中间377后面875 群里有志同道合 ...

  9. 牛客--追债之旅 两种解法

    文章目录 第一种 第二种: 一共两种解法,所以即便你不会最短路,也可以做,甚至爆搜+剪枝的时间和空间消耗小于最短路做法. 第一种 题意: 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市 ...

最新文章

  1. Python高级特性:切片
  2. 逻辑备库的Swichover和Failover
  3. 如果用户的计算机在查询本地Net,网络操作系统管理2448-2
  4. java mqtt客户端_java 实现mqtt发送和接收消息客户端具体用法及测试代码
  5. 面向接口编程 (噬菌体) 不错的接口
  6. 面试(2)——StringBuffer StringBuilder String /==与equals
  7. LINUX awk操作
  8. idea部署web项目到tomcat注意事项
  9. 见过一个一个拉新地推没见过这么多一起推
  10. 2 Advanced Read/Write Splitting with PHP’s MySQLnd
  11. 概率统计笔记:二维随机变量及其联合概率分布
  12. 如何进行项目管理?企业项目管理常见的组织形式有哪些?
  13. Word界面中无法切换到输入法的解决…
  14. vs2017 git 操作重置、还原、挑拣对比
  15. 九种常用输入法特殊符号功能大揭密
  16. 【VUE】vue3.0后台常用模板
  17. 【JAVADAY9、常见的8个类的使用】
  18. 【Python】python基础编程回顾(3)
  19. nodejs安装及配置
  20. 九连环 C语言递归代码

热门文章

  1. 首家乘用车前向雷达定点爆出,国产毫米波雷达正在冲出重围
  2. python读取、显示、保存图片
  3. ZigBee学习笔记——(一)无线传感器网络
  4. 2020年初,新征程,满怀期待,再出发
  5. 第3章第28节:合并形状:通过形状合并功能制作更加丰富的形状 [PowerPoint精美幻灯片实战教程]
  6. Nginx代理外网到本地Vue开发环境
  7. 海量数据存储技术与解决方案
  8. 使用Assembly来开发c#程序
  9. 散户如何进行开展量化股票交易的?
  10. 希捷16TB硬盘上市:速度堪比SSD 售价将近5000元