【POJ No. 3258】 跳房子游戏 River Hopscotch

POJ题目地址

【题意】

跳房子游戏指从河中的一块石头跳到另一块石头,这发生在一条又长又直的河流中,从一块石头开始,到另一块石头结束。长度为L (1≤L ≤10^9 ),从开始到结束之间的石头数量为N (0≤N ≤50 000),从每块石头到开始位置有一个整数距离di(0<di <L )。

为了玩游戏,每头母牛都依次从起始石头开始,并尝试到达终点的石头,只能从石头跳到石头。当然,不那么灵活的母牛永远不会到达最后的石头,而是掉进河中。约翰计划移除几块石头,以增加母牛必须跳到最后的最短距离。不能删除起点和终点的石头,但约翰有足够的资源移除多达M 块石头(0≤M ≤N )。请确定在移除M 块石头后,母牛必须跳跃的最短距离的最大值。

【输入输出】

输入:

第1行包含3个整数L 、N 和M 。接下来的N 行,每行都包含一个整数,表示从该石头到起始石头的距离。没有两块石头有相同的位置。

输出:

单行输出移除M 块石头后母牛必须跳跃的最短距离的最大值。

【样例】

【思路分析】

根据输入样例,构建的图如下图所示。

在移除任何石头之前,跳跃的最短距离都是2(从0到2)。在移除2和14石头后,跳跃的最短距离是4(从17到21或从21到25)。

【算法设计】

① 如果移除的石头数等于总石头数(M =N ),则直接输出L 。

② 增加开始(0)和结束(N +l)两块石头,到开始节点的距离分别为0和L 。

③ 对所有的石头都按照到开始节点的距离从小到大排序。

④ 令left=0,right=L ,如果right-left>1,则mid=(right+left)/2,判断是否满足移除M 块石头之后,任意间距都不小于mid。如果满足,则说明距离还可以更大,令left=mid;否则令right=mid,继续进行二分搜索。

⑤ 搜索结束后,left就是母牛必须跳跃的最短距离的最大值。

【举个栗子】

① 根据输入样例,增加开始和结束两块石头,按照到开始节点的距离从小到大排序。

② 令left=0,right=L =25,right-left>1,mid=(right+left)/2=12,判断是否满足移除两块石头之后,任意间距都不小于12。相当于将3块石头放置在开始位置和结束位置之间,且满足任意间距都不小于12。

用last记录前一块已放置石头的下标,初始时last=0,找第1个与last距离大于或等于12的位置,找到14,放置第1块石头,更新last=3。

继续找第1个与last距离大于或等于12的位置,未找到,说明无法满足条件。缩小距离,令right=mid=12,继续搜索。

③ left=0,right=12,mid=(right+left)/2=6,判断是否满足移除两块石头之后,任意间距都不小于6。初始时last=0,找第1个与last距离大于或等于6的位置,找到11,放置第1块石头,更新last=2。

继续找第1个与last距离大于或等于6的位置,找到17,放置第2块石头,更新last=4。

④ left=0,right=6,mid=(right+left)/2=3,判断是否满足移除两块石头之后,任意间距都不小于3。初始时last=0,找第1个与last距离大于或等于3的位置,找到11,放置第1块石头,更新last=2。

继续找第1个与last距离大于或等于3的位置,找到14,放置第2块石头,更新last=3。

继续找第1个与last距离大于或等于3的位置,找到17,放置第3块石头,可以放置3块石头,满足条件。增加距离,令left=mid=3,继续搜索。

⑤ left=3,right=6,mid=(right+left)/2=4,判断是否满足移除两块石头之后,任意间距都不小于4。初始时last=0,找第1个与last距离大于或等于4的位置,找到11,放置第1块石头,更新last=2。

继续找第1个与last距离大于或等于4的位置,找到17,放置第2块石头,更新last=4。

继续找第1个与last距离大于或等于4的位置,找到21,放置第3块石头,可以放置3块石头,满足条件。增加距离,令left=mid=4,继续搜索。

⑥ left=4,right=6,mid=(right+left)/2=5,判断是否满足移除两块石头之后,任意间距都不小于5。初始时last=0,找第1个与last距离大于或等于5的位置,找到11,放置第1块石头,更新last=2。

继续找第1个与last距离大于或等于5的位置,找到17,放置第2块石头,更新last=4。

继续找第1个与last距离大于或等于5的位置,未找到,说明无法满足条件。缩小距离,令right=mid=5,继续搜索。

⑦ left=4,right=5,此时right-left=1,算法结束,输出答案left=4。

【算法实现】

判断函数相当于将n -m 块石头放置在开始位置和结束位置之间,且任意间距都不小于x 。

#include<iostream>
#include<algorithm>using namespace std;const int maxn = 50050;
int L ,n , m , dis[maxn];bool judge(int x ){ //移除m 个 石头之后,任意间距不小于x int num = n - m; //减掉m 个石头,放置num 个石头,循环num 次int last = 0; //记录前一个已放置石头下标 for(int i = 0 ; i < num ; i++){ //对于这些石头,要使得任意间距不小于x int cur = last + 1;while(cur <= n && dis[cur] - dis[last] < x){ //放在第1个与last距离>=x 的位置 cur ++; //由cur 累计位置   }if(cur > n){return 0; //如果在这个过程中大于n 了,说明放不开 }last = cur; //更新last 位置 }return 1;
}int main(){cin >> L >> n >> m;if(n == m){cout << L << endl;return 0;}for(int i = 1 ; i <= n ; i++){cin >> dis[i];}dis[0] = 0; //增加开始点dis[n + 1] = L; //增加结束点sort(dis , dis + n + 2);int left = 0 , right = L;while(right - left > 1){int mid = (right + left) / 2;if(judge(mid)){left = mid; //如果放得开,说明x 还可以更大 }else{right = mid;}} cout << left << endl;return 0;
}

【POJ No. 3258】 跳房子游戏 River Hopscotch相关推荐

  1. POJ 3258 River Hopscotch 经典二分

    点击打开链接 River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6189   Accepted: ...

  2. POJ 3258 River Hopscotch 二分

    题意:奶牛们喜欢在河里的石头上玩跳房子游戏,每次从一个石头跳到另一个石头上.现在知道起点的石头,终点的石头,以及终点石头到起点石头的距离L.又知道起点-终点之间还有N个石头,每个石头到起点的距离记为r ...

  3. River Hopscotch

    题目链接:http://poj.org/problem?id=3258 River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total ...

  4. bzoj 1650: [Usaco2006 Dec]River Hopscotch 跳石子(二分)

    1650: [Usaco2006 Dec]River Hopscotch 跳石子 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 721  Solved: ...

  5. River Hopscotch问题(二分)

    又是一个卡了我好久好久好久的二分题 我真的不会二分啊,有没有大佬可以给我讲讲 我就是个憨憨 题目链接River Hopscotch 题目描述: Every year the cows hold an ...

  6. POJ 3258 -- River Hopscotch(二分)

    题目链接 Description Every year the cows hold an event featuring a peculiar version of hopscotch that in ...

  7. 二分+最大化最小值 River Hopscotch POJ - 3258

    题意: 起始有两个石头,位置是000和nnn,在这中间有n个石头,问如何拿走m块石头后,使得他们之间的最小间隔的最大值. 题目: Every year the cows hold an event f ...

  8. poj 3258 River Hopscotch 二分答案

    题目地址: http://poj.org/problem?id=3258 题目思路: 首先,如果只减少一部,那么一定要干掉最短的那段距离(一旦不消灭,最小的还是它,并没有达到使最小值取最大的理想情况) ...

  9. POJ 3258 River Hopscotch (二分)

    题目地址:POJ 3258 水题.二分距离,判断是否可行.需要注意的是最后一个,因为最后一个是没法移除的,所以还要倒着判断一下. 代码如下: #include <iostream> #in ...

最新文章

  1. Android适应方案汇总(三)
  2. 【PP生产订单】入门介绍(十一)
  3. 【转】Windows编程之hdc和hwnd的区别
  4. python的程序格式框架_关于Python程序格式框架的描述,以下选项中错误的是
  5. Nginx 配置 SSL 及 HTTPS 协议通信过程
  6. (转载)UI设计还远没有满足客户的需求
  7. 实现indexof()
  8. 嘘,我已经瞒着开发解锁APP日志文件抓取及分析啦!
  9. nvidia控制面板官方版-nvidia控制面板附安装教程
  10. excel转word_excel怎么转word?常用方法合集,看你使用哪一种
  11. seata-order-service2006模块
  12. 实现div元素在整个屏幕的的垂直居中之translateY(-50%)的利用
  13. 魔兽世界插件开发:Beginning Lua with World of Warcraft Add-ons 中文翻译及学习 (1.1)
  14. 荷兰量子生态联盟投资110万欧元开发超导量子处理器
  15. python计算工资一周不超过40小时_GitHub - xk1411/Python-100-Days: Python - 100天从新手到大师...
  16. 《Ogre一步一步学开发》 一、Ogre源码编译与安装,从源代码开始构建Ogre图文教程(Ogre 1.12.1 Source + VS2019 + Windows10)
  17. 考研可以跨计算机专业吗,食品安全的本科生考研,可以跨考计算机专业吗?
  18. 吃鸡服务器维护7月5号,绝地求生7月5日维护到几点 7月5日吃鸡更新维护公告
  19. winxp 关闭445端口
  20. 深度盘点:机器学习、深度学习面试知识点3W字汇总

热门文章

  1. Java语言程序设计(郎波) 笔记(一)
  2. 区块链地址是什么?如何获取地址信息 | Tokenview
  3. AndroidO Treble架构分析
  4. glibc 知:手册12:输入/输出流
  5. android 唤醒和解锁屏幕
  6. 【51单片机】HX711智能电子秤设计
  7. 纪念被我刷过的电子设备(上涨更新中。。。)
  8. 云渲染答疑:动画渲染价格一般多少?
  9. 【数据结构-链表】链表的相关算法
  10. 无人机项目跟踪详解七十——升压电路及LM27313详解