POJ 3258 River Hopscotch(二分法)

River Hopscotch

Every year the cows hold an event featuring a peculiar version of
hopscotch that involves carefully jumping from rock to rock in a
river. The excitement takes place on a long, straight river with a
rock at the start and another rock at the end, L units away from the
start (1 ≤ L ≤ 1,000,000,000). Along the river between the starting
and ending rocks, N (0 ≤ N ≤ 50,000) more rocks appear, each at an
integral distance Di from the start (0 < Di < L).

To play the game, each cow in turn starts at the starting rock and
tries to reach the finish at the ending rock, jumping only from rock
to rock. Of course, less agile cows never make it to the final rock,
ending up instead in the river.

Farmer John is proud of his cows and watches this event each year. But
as time goes by, he tires of watching the timid cows of the other
farmers limp across the short distances between rocks placed too
closely together. He plans to remove several rocks in order to
increase the shortest distance a cow will have to jump to reach the
end. He knows he cannot remove the starting and ending rocks, but he
calculates that he has enough resources to remove up to M rocks (0 ≤ M
≤ N).

FJ wants to know exactly how much he can increase the shortest
distance before he starts removing the rocks. Help Farmer John
determine the greatest possible shortest distance a cow has to jump
after removing the optimal set of M rocks.

Input

Line 1: Three space-separated integers: L, N, and M Lines 2… N+1:
Each line contains a single integer indicating how far some rock is
away from the starting rock. No two rocks share the same position.

Output

Line 1: A single integer that is the maximum of the shortest distance
a cow has to jump after removing M rocks

Sample Input
25 5 2
2
14
11
21
17
Sample Output
4
Hint
Before removing any rocks, the shortest jump was a jump of 2 from 0 (the start) to 2. After removing the rocks at 2 and 14, the shortest required jump is a jump of 4 (from 17 to 21 or from 21 to 25).

题意:
首先有两块岩石,距离为l,然后有n块岩石,告诉你这n块岩石离第一块岩石的距离,青蛙在跳跃的过程中从第一块岩石跳到最后一块岩石,你可以移走m块岩石,问你移走岩石后青蛙最短跳跃距离的最大值是多少
思路:
这道题用的是二分法枚举最大的跳跃距离,在判断过程中,如果当前的跳跃距离小于枚举的距离,肯定是要将此处的岩石移走的,移走的次数+1,直到当前的距离大于等于枚举的距离,然后清零继续往后面枚举

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<math.h>
#include<queue>
#include<iomanip>
using namespace std;
const int inf=0x3f3f3f3f;
int v[50005],s[50005];
int n,m,len;
bool tp(int mid)
{
    int sum=0,x=0;
    for(int a=1;a<=n+1;a++)
    {
        if(sum>m) //移动的次数大于最多移动的次数就表明枚举的最大距离大了	
            return false;
        if(s[a]+x<mid)
        {
            x=s[a]+x;
            sum++;
        }
        else
        {
            x=0;
        }
    }
    return true;
}
int main()
{

    scanf("%d%d%d",&len,&n,&m);
    v[0]=0;
    for(int a=1;a<=n;a++)
    {
        scanf("%d",&v[a]);
    }
    v[n+1]=len;
    sort(v,v+n+1);
    for(int a=1;a<=n+1;a++)
    {
        s[a]=v[a]-v[a-1];
    }
//    for(int a=1;a<=n+1;a++)
//    {
//        printf("%d ",s[a]);
//    }
//    printf("\n");
    int l=1,r=len,mid;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(tp(mid))
        {
            l=mid+1;
        }
        else
        {
            r=mid-1;
        }
//        printf("%d %d %d\n",l,r,mid);
    }
    printf("%d\n",(l+r)/2);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值