【POJ No. 3258】 跳房子游戏 River Hopscotch
【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相关推荐
- POJ 3258 River Hopscotch 经典二分
点击打开链接 River Hopscotch Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6189 Accepted: ...
- POJ 3258 River Hopscotch 二分
题意:奶牛们喜欢在河里的石头上玩跳房子游戏,每次从一个石头跳到另一个石头上.现在知道起点的石头,终点的石头,以及终点石头到起点石头的距离L.又知道起点-终点之间还有N个石头,每个石头到起点的距离记为r ...
- River Hopscotch
题目链接:http://poj.org/problem?id=3258 River Hopscotch Time Limit: 2000MS Memory Limit: 65536K Total ...
- bzoj 1650: [Usaco2006 Dec]River Hopscotch 跳石子(二分)
1650: [Usaco2006 Dec]River Hopscotch 跳石子 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 721 Solved: ...
- River Hopscotch问题(二分)
又是一个卡了我好久好久好久的二分题 我真的不会二分啊,有没有大佬可以给我讲讲 我就是个憨憨 题目链接River Hopscotch 题目描述: Every year the cows hold an ...
- POJ 3258 -- River Hopscotch(二分)
题目链接 Description Every year the cows hold an event featuring a peculiar version of hopscotch that in ...
- 二分+最大化最小值 River Hopscotch POJ - 3258
题意: 起始有两个石头,位置是000和nnn,在这中间有n个石头,问如何拿走m块石头后,使得他们之间的最小间隔的最大值. 题目: Every year the cows hold an event f ...
- poj 3258 River Hopscotch 二分答案
题目地址: http://poj.org/problem?id=3258 题目思路: 首先,如果只减少一部,那么一定要干掉最短的那段距离(一旦不消灭,最小的还是它,并没有达到使最小值取最大的理想情况) ...
- POJ 3258 River Hopscotch (二分)
题目地址:POJ 3258 水题.二分距离,判断是否可行.需要注意的是最后一个,因为最后一个是没法移除的,所以还要倒着判断一下. 代码如下: #include <iostream> #in ...
最新文章
- Android适应方案汇总(三)
- 【PP生产订单】入门介绍(十一)
- 【转】Windows编程之hdc和hwnd的区别
- python的程序格式框架_关于Python程序格式框架的描述,以下选项中错误的是
- Nginx 配置 SSL 及 HTTPS 协议通信过程
- (转载)UI设计还远没有满足客户的需求
- 实现indexof()
- 嘘,我已经瞒着开发解锁APP日志文件抓取及分析啦!
- nvidia控制面板官方版-nvidia控制面板附安装教程
- excel转word_excel怎么转word?常用方法合集,看你使用哪一种
- seata-order-service2006模块
- 实现div元素在整个屏幕的的垂直居中之translateY(-50%)的利用
- 魔兽世界插件开发:Beginning Lua with World of Warcraft Add-ons 中文翻译及学习 (1.1)
- 荷兰量子生态联盟投资110万欧元开发超导量子处理器
- python计算工资一周不超过40小时_GitHub - xk1411/Python-100-Days: Python - 100天从新手到大师...
- 《Ogre一步一步学开发》 一、Ogre源码编译与安装,从源代码开始构建Ogre图文教程(Ogre 1.12.1 Source + VS2019 + Windows10)
- 考研可以跨计算机专业吗,食品安全的本科生考研,可以跨考计算机专业吗?
- 吃鸡服务器维护7月5号,绝地求生7月5日维护到几点 7月5日吃鸡更新维护公告
- winxp 关闭445端口
- 深度盘点:机器学习、深度学习面试知识点3W字汇总