牛客3402E-一步两步是魔鬼的步伐-二分
题目描述:
链接: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-一步两步是魔鬼的步伐-二分相关推荐
- 牛客题霸 [合并两个有序的数组] C++题解/答案
牛客题霸 [合并两个有序的数组] C++题解/答案 题目描述 给出两个有序的整数数组 和 ,请将数组 合并到数组 中,变成一个有序的数组 注意: 可以假设 数组有足够的空间存放 数组的元素, 和 中初 ...
- Python 斐波那契/跳台阶一步两步/跳台阶多种步法/配零钱
Python3.6.3 跳台阶一步两步 1. 跳n(n∈N)阶台阶过程中最多有 n//2 步是跳了2阶,2阶步数固定的情况下可以用 C(总步数, 2阶的步数) 求出方法数,再把所有情况都加起来即可. ...
- [C++] 牛客网:合并两个有序的数组
主要是体验一下牛客网里的核心代码模式到底是怎么弄的..还有C++这个东西平常用的太少了,试一试. 以外的还体验到了sort()函数的使用. 来源:牛客网 题目链接:合并两个有序的数组 知识点:数组.双 ...
- 牛客小白月赛17 F小黄鸭(计算几何+积分+二分)
链接:https://ac.nowcoder.com/acm/contest/1085/F 来源:牛客网 题目描述 小sun的寝室有一只小黄鸭,小黄鸭浮在水面上的样子特别可爱,现在小sun有一个问题: ...
- 牛客网oi测试赛E旅行青蛙【LIS二分】
链接:https://www.nowcoder.com/acm/contest/181/E 来源:牛客网 题目描述 一只青蛙出去旅游,因为中国有一句古话说的好:"由简入奢易,由奢入俭难&qu ...
- 牛客3007E-立方数-欧拉线性筛+素数分解+二分
链接:https://ac.nowcoder.com/acm/contest/3007/E 来源:牛客网 题目描述: 对于给定的正整数 N,求最大的正整数 A,使得存在正整数 B,满足 A3B=N 输 ...
- 极客DIY:只用两步教你制作一款可编程键盘 [译]
原文出处: Freebuf黑客与极客 对于那些工作时需要与许多组合键打交道的人(比如经常使用Photoshop的人)来说,一款可编程键盘无疑是十分实用的.本期的DIY将为大家带来一款可编程键盘,其制 ...
- github的python代码怎么跑_python程序员一步两步教你使用GitHub!
作为一个Python爬虫师一步步教你们怎么把代码放入到github 中! 首先呢我们下载一个git的客户端 学习Python中有不明白推荐加入交流群号: 前面548中间377后面875 群里有志同道合 ...
- 牛客--追债之旅 两种解法
文章目录 第一种 第二种: 一共两种解法,所以即便你不会最短路,也可以做,甚至爆搜+剪枝的时间和空间消耗小于最短路做法. 第一种 题意: 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市 ...
最新文章
- Python高级特性:切片
- 逻辑备库的Swichover和Failover
- 如果用户的计算机在查询本地Net,网络操作系统管理2448-2
- java mqtt客户端_java 实现mqtt发送和接收消息客户端具体用法及测试代码
- 面向接口编程 (噬菌体) 不错的接口
- 面试(2)——StringBuffer StringBuilder String /==与equals
- LINUX awk操作
- idea部署web项目到tomcat注意事项
- 见过一个一个拉新地推没见过这么多一起推
- 2 Advanced Read/Write Splitting with PHP’s MySQLnd
- 概率统计笔记:二维随机变量及其联合概率分布
- 如何进行项目管理?企业项目管理常见的组织形式有哪些?
- Word界面中无法切换到输入法的解决…
- vs2017 git 操作重置、还原、挑拣对比
- 九种常用输入法特殊符号功能大揭密
- 【VUE】vue3.0后台常用模板
- 【JAVADAY9、常见的8个类的使用】
- 【Python】python基础编程回顾(3)
- nodejs安装及配置
- 九连环 C语言递归代码