【题目链接】

ybt 1890:【15NOIP提高组】跳石头
洛谷 P2678 [NOIP2015 提高组] 跳石头
ybt 1247:河中跳房子
OpenJudge NOI 1.11 10:河中跳房子
(该题与下面两题是同一题,提交代码都不用改。)

【题目考点】

1. 二分答案

【解题思路】

将问题抽象:长为L的线段中有N个点,移除M个点,留下N-M个点,将整条线段划分为N-M+1个线段。求所有可能的划分方案中,最短线段最长的那种方案下,最短线段的长度。
方案数有CNMC_N^MCNM​种,而M,N达到5∗1045*10^45∗104,数量级,如果想枚举所有方案,求每种方案下的最短线段然后求最大值,显然不可行。
逆向思考,如果给定点之间最小距离x,即点之间的距离必须大于等于x。
需要满足条件为:看移除M个点的多种方案中,是否存在一种方案其最短线段长度大于等于x
而要判断该条件是否成立,仍然比较困难。我们可以再逆向思考该命题,将其转化为:让每条线段长度都大于等于x,看最少需要移除多少个点

  • 如果移除的点的数量小于等于M,则存在一种方案其最短线段长度大于等于x,条件成立。
  • 如果移除的点的数量大于M,则不存在这样的方案,条件不成立。
    统计最少移除点数量的方法为:将起点视为观察点,将距离观察点x范围内的点都移除,再将下一个点视为观察点,将距离它x范围内的点都移除。重复执行。如果终点也在被移除的范围内,则应该移除当前观察点。

清楚要判断的条件后,这就是一个二分答案求满足某一条件最大值的问题
求中点:mid = (l+r+1)/2;
如果x满足条件,下一次x应该更大,取右半边,l = mid;
如果x不满足条件,下一次x应该更小,取左半边,r = mid - 1;

最后得到的结果就是要求的各种方案中最短线段的最大值。

【题解代码】

解法1:二分答案

#include<bits/stdc++.h>
using namespace std;
#define N 50005
int len, n, m, d[N];//d[i]:点i到左端的距离
//要判断:看移除M个点的多种方案中,是否存在一种方案其最短线段长度大于等于x
//实际做:让每条线段长度都大于等于x,看最少需要移除点的数量是否小于等于M
bool check(int x)
{int ct = 0, p = 0;//p:当前观察的点的位置 for(int i = 1; i <= n; ++i){if(d[i] - p < x)//如果到当前观察位置距离小于x,则移除 ct++;else//如果点i到当前观察的位置的距离大于等于xp = d[i];//则i的位置为当前观察的位置}if(len - p < x)//如果终点到观察点距离小于xct++;//移除观察点return ct <= m;//看移除点的数量是否小于等于M
}
int main()
{cin >> len >> n >> m;for(int i = 1; i <= n; ++i)cin >> d[i];int l = 0, r = len, mid;while(l < r){mid = (l + r + 1) / 2;if(check(mid))l = mid;elser = mid - 1;}cout << l;return 0;
}

信息学奥赛一本通 1890:【15NOIP提高组】跳石头 | 洛谷 P2678 [NOIP2015 提高组] 跳石头相关推荐

  1. 洛谷P2678 [NOIP2015 提高组] 跳石头

    传送门:https://www.luogu.com.cn/problem/P2678 非常同意一个观点:二分答案由二分区间和judge函数构成 二分答案,顾名思义,就是找到答案的范围区间,然后在这个区 ...

  2. 信息学奥赛一本通 1392:繁忙的都市(city) | 洛谷 P2330 [SCOI2005]繁忙的都市

    [题目链接] ybt 1392:繁忙的都市(city) 洛谷 P2330 [SCOI2005]繁忙的都市 [题目考点] 1. 图论 最小生成树 [解题思路] 将题目叙述转为图论概念,交叉路口为顶点,道 ...

  3. 信息学奥赛一本通 1375:骑马修栅栏(fence) | 洛谷 P2731 [USACO3.3]骑马修栅栏 Riding the Fences

    [题目链接] ybt 1375:骑马修栅栏(fence) 洛谷 P2731 [USACO3.3]骑马修栅栏 Riding the Fences [题目考点] 1. 图论:欧拉回路 欧拉回路存在的条件: ...

  4. 信息学奥赛一本通 1970:【15NOIP普及组】扫雷游戏 | OpenJudge NOI 1.8 14:扫雷游戏地雷数计算 | 洛谷 P2670 [NOIP2015 普及组] 扫雷游戏

    [题目链接] ybt 1970:[15NOIP普及组]扫雷游戏 OpenJudge NOI 1.8 14:扫雷游戏地雷数计算 洛谷 P2670 [NOIP2015 普及组] 扫雷游戏 [题目考点] 1 ...

  5. 信息学奥赛一本通 1100:金币 | 1969:【15NOIP普及组】金币 | OpenJudge NOI 1.5 45 | 洛谷 P2669 [NOIP2015 普及组] 金币

    [题目链接] ybt 1100:金币 ybt 1969:[15NOIP普及组]金币 OpenJudge NOI 1.5 45:金币 洛谷 P2669 [NOIP2015 普及组] 金币 [题目考点] ...

  6. 信息学奥赛一本通 ybt 1933:【05NOIP普及组】循环 | 洛谷 P1050 [NOIP2005 普及组] 循环

    [题目链接] ybt 1933:[05NOIP普及组]循环 洛谷 P1050 [NOIP2005 普及组] 循环 [题目考点] 1.高精度 2.数学 [解题思路] 要求最后k位的循环长度,可以从低位向 ...

  7. 信息学奥赛一本通 1937:【06NOIP普及组】数列 | 洛谷 P1062 [NOIP2006 普及组] 数列

    [题目链接] ybt 1937:[06NOIP普及组]数列 洛谷 P1062 [NOIP2006 普及组] 数列 [题目考点] 1. 数制 [解题思路] 如果k为2,那么这个数列 第1项为202^02 ...

  8. 信息学奥赛一本通 1961:【13NOIP普及组】计数问题 | 洛谷 P1980 [NOIP2013 普及组] 计数问题

    [题目链接] ybt 1961:[13NOIP普及组]计数问题 洛谷 P1980 [NOIP2013 普及组] 计数问题 [题目考点] 1. 数字拆分 [解题思路] 遍历1~n的各个数字,对每个数字做 ...

  9. 信息学奥赛一本通 1414:【17NOIP普及组】成绩 | 洛谷 P3954 [NOIP2017 普及组] 成绩

    [题目链接] ybt 1414:[17NOIP普及组]成绩 洛谷 P3954 [NOIP2017 普及组] 成绩 [题目考点] 1. 算术表达式 2. 自动类型转换 低精度类型与高精度类型计算结果是高 ...

最新文章

  1. web.py使用要点
  2. 1周第1课 Linux 认知、安装 Centos7
  3. python脚本编程实例_C程序调用Python脚本的例子
  4. python 代码替换_用Python将绝对URL替换成相对URL的代码
  5. 基于JAVA+SpringBoot+Mybatis+MYSQL的医药进销存管理系统
  6. Python创建多线程(join线程同步)
  7. JAVA中的多线程(八):线程的优先级和yield方法
  8. Optisystem 光锁相环
  9. 中标麒麟的下载和安装
  10. 卸载 Creative Cloud 桌面应用程序(macOS、Windows)
  11. node.js中操作数据库
  12. SPU、SKU、SKC、ARPU是什么
  13. 中国标准时间转换为年月日时分秒,指定00:00:00 或23:59:59或当下时分秒
  14. java中date获取前一天和后一天
  15. 由旧版本环信对接之后没有声音,探索AVAudioSession的Category和Option
  16. LayoutInflater深度解析,学习方式分享
  17. Idea运行项目报错:java.lang.OutOfMemoryError: Java heap space 解决方法
  18. ubuntu下lintel的安装配置
  19. 数字广告 —— 使用案例与最佳实践
  20. 批量修改图片的创建日期

热门文章

  1. SVN的安装配置(一)
  2. poj2778DNA Sequence (AC自动机+矩阵快速幂)
  3. NHibernate学习导航
  4. 那天,他无意间瞟了眼程序员的桌面……
  5. Modbus节点地址规则
  6. 51单片机如何用c语言位定义,嵌入式编程(一):51单片机如何将函数 定义到指定程序地址...
  7. 开发10年,全记在这本Java进阶宝典里了!
  8. JEECG支付服务窗专题 - 平台与服务窗接口对接
  9. 编程体系结构(08):Spring.Mvc.Boot框架
  10. JS每日一题:vue中keepalive怎么理解?