二分查找---河中跳房子

原创 2017年12月09日 21:56:48
每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点L远 (1 ≤ L≤ 1,000,000,000) 的终点处均有一个岩石。在起点和终点之间,有N (0 ≤ N ≤ 50,000) 个岩石,每个岩石与起点的距离分别为Di (0 < Di < L)。
在比赛过程中,奶牛轮流从起点出发,尝试到达终点,每一步只能从一个岩石跳到另一个岩石。当然,实力不济的奶牛是没有办法完成目标的。
农夫约翰为他的奶牛们感到自豪并且年年都观看了这项比赛。但随着时间的推移,看着其他农夫的胆小奶牛们在相距很近的岩石之间缓慢前行,他感到非常厌烦。他计划移走一些岩石,使得从起点到终点的过程中,最短的跳跃距离最长。他可以移走除起点和终点外至多M (0 ≤ MN) 个岩石。
请帮助约翰确定移走这些岩石后,最长可能的最短跳跃距离是多少?

输入
第一行包含三个整数L, N, M,相邻两个整数之间用单个空格隔开。
接下来N行,每行一个整数,表示每个岩石与起点的距离。岩石按与起点距离从近到远给出,且不会有两个岩石出现在同一个位置。
输出
一个整数,最长可能的最短跳跃距离。
样例输入
25 5 2211141721
样例输出
4
解法:
题目分析:
1.序列N中存放的是中间N个石头的位置,起止点的位置没有存储。
2.移除只能移除N中的M个石头,起止点的石头都不能动
3.牛一块石头挨一块的跳,不能连续跳石头。
思路:
1.假设最大的最小跳距离时D,那么和stone[i]距离小于D的时候都要被移除。
2.D的最小取值就是1,最大取值就是把N个石头全移走,直接从起始点调到终止点。
原始思路纠正。
int L,N,M;
cin>>L>>N>>M;
int stone[50010];
for(int i = 1;i<=N;i++)
cin>>stone[i];
max_dis = L;//注意最后一跳,牛是直接跳过去的。
----------------------------------------------------------------
1.没有存起止点的位置
stone[0]=0,stone[N+1]=L
------------------------------------------------------------------
//1.统计两块石头间的最小距离,这个步骤可有可无
int l = 0,r = max_dis;
----------------------------------------------------------------
2.最小的距离至少是1,最大的距离时L
题目说的起止点是stone[0]和stone[N+1],不是stone[1]和stone[N],
后边这一组是可以移除的
l=0, r=L
------------------------------------------------------------------
while(l<=r)
{ D = (r+l)/2;
int start = 0;
total = 0;
----------------------------------------------------------------
3.这时候要从stone[1]一直分析到stone[N+1],把中间该移除
的石头全部移走。
问:题目明确说不能移走stone[N+1]呀?
如果stone[N+1]被移走,则说明它在某个D之内,也就是说这一跳与前边一块石头的距离小于D,而这与题目假设条件--D为最小跳距相矛盾;另一方面则,说明这个D过大,被移走的M过多。因此,系统需要把D往小调,直到令stone[N+1]与紧邻的最后一块石头的距离>=D。
------------------------------------------------------------------
for(int i = 1;i<N i<=N+1;i++) //题目明确规定是除起点和终点外的石头,
{
//从i+1开始找,只要和i的距离小于D,就必须移除。
if(stone[i]-stone[start]<D&&i!=N-1)//终点外的石头,
total++;
else
start = i;
}
if(total>M) //说明D太大了,移除的石头太多了
R = D-1;
else
{
last_D = D;
L = D+1;
}
}

标准答案:
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int L,N,M;
cin>>L>>N>>M;
long stone[50010];
stone[0]=0;
for(int i = 1;i<=N;i++)
cin>>stone[i];
long max_dis = L;//注意最后一跳,牛是直接跳过去的。
//1.统计两块石头间的最小距离,这个步骤可有可无
long l = 1,r = L;
stone[N+1] = L;
//cout<<"r "<<r<<endl;
long last_D,D;
while(l<=r)
{ D = (r+l)/2;
int start = 0;
int total = 0;
for(int i = 1;i<=N+1;i++) //题目明确规定是除起点和终点外的石头,
{
//从i+1开始找,只要和i的距离小于D,就必须移除。
if(stone[i]-stone[start]<D)
{
total++;
}
else
start = i;
}
if(total>M) //说明D太大了,移除的石头太多了
r = D-1;
else
{
last_D = D;
//cout<<D<<endl;
l = D+1;
}
}
cout<<last_D;
}

Unity3d开发跳一跳

使用Unity2017.3开发“跳一跳”小游戏的教程。
  • 2018年01月18日 18:09

10:河中跳房子OJ

总时间限制: 1000ms 内存限制: 65536kB 描述 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起...
  • sinat_34943123
  • sinat_34943123
  • 2016-05-11 11:05:25
  • 1546

|NOIOJ|NOIP2015|二分|10:河中跳房子

描述 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点L远 (1 ≤ L≤ 1,000,000,000) ...
  • Darost
  • Darost
  • 2016-05-29 21:42:37
  • 1937

【openjudge】河中跳房子 二分查找

河中跳房子总时间限制: 1000ms 内存限制: 65536kB 描述 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行...
  • zhhe0101
  • zhhe0101
  • 2016-10-14 20:50:40
  • 494

河中跳房子

查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的...
  • Wanglinlin_bfcx
  • Wanglinlin_bfcx
  • 2017-01-05 11:47:32
  • 702

NOIP2017跳房子(普及T4)

T4题面传送门感觉在pj组放这道题是不是有些难了,难度大于NOIP2015D2T1那道跳石子老套路先二分答案+DPf[i]表示跳前i个格子,且停在第i个格子最大分数;sc[i]表示第i个格子的分数。转...
  • qwerty1125
  • qwerty1125
  • 2017-11-25 22:19:25
  • 506

OpenJudge_P8201 河中跳房子

总时间限制: 1000ms 内存限制: 65536kB 描述 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行,在起点和...
  • qq_18455665
  • qq_18455665
  • 2015-11-23 19:48:19
  • 1017

05派 OJ

总时间限制: 1000ms内存限制: 65536kB 描述 我的生日要到了!根据习俗,我需要将一些派分给大家。我有N个不同口味、不同大小的派。有F个朋友会来参加我的派对,每个人会拿到一块派...
  • sinat_34943123
  • sinat_34943123
  • 2016-05-10 22:28:02
  • 457

NKOI3600 河中跳房子游戏

[二分答案] 题目描述 每年,奶牛们都举办一种特殊的跳房子游戏,在这个游戏中,大家小心翼翼地在河中的岩石上跳。这个游戏在一条笔直的河中进行,以一块岩石表示开始,以另一块距离起点L单位长度的岩...
  • ArliaStark
  • ArliaStark
  • 2018-02-02 11:49:43
  • 36

【NOIP2017】跳房子

这题我0分。 比赛时,我一眼出正解,哈哈,太水了!这题不就是一个二分+DP+单调队列吗?然而,细节决定成败。我错了许多细节,就挂了。 我只考了0分。。。首先,这题满足一个条件:保证g变大后,如果原...
  • huangzihaoal
  • huangzihaoal
  • 2017-11-25 11:21:45
  • 322
收藏助手
不良信息举报
您举报文章:二分查找---河中跳房子
举报原因:
原因补充:

(最多只允许输入30个字)