POJ3258-River Hopscotch-二分答案

一条河里有一串石头,给出石头间的间距,让你去掉m个石头,使最短间距最大。

二分答案,对于每一种mid,判断要不要删除这块石头。然后逼近答案。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int dist[50010],save[50010],L,N,M;

int main()
{
    while(~scanf("%d%d%d",&L,&N,&M))
    {
        int low = L,high = L;
        for(int i=0;i<N;i++)
        {
            scanf("%d",&dist[i]);
            low = min(low,dist[i]-dist[i-1]);
        }
        dist[N] = 0;
        dist[N+1] = L;
        N+=2;
        sort(dist,dist+N);

        int mid = (low+high)>>1;

        while(low <= high)
        {
            int rmv = 0,sum=0;
            for(int i=1;i<N;i++)
            {
                if(sum+dist[i]-dist[i-1] <= mid)
                {
                    rmv++;
                    sum+=dist[i]-dist[i-1];
                }
                else
                {
                    sum=0;
                }
            }

            if(rmv > M)
                high = mid-1;
            else
                low = mid+1;

            mid = (low+high)>>1;
        }
        printf("%d\n",low);
    }
}
时间: 2024-08-07 16:41:50

POJ3258-River Hopscotch-二分答案的相关文章

POJ 3258 River Hopscotch 二分答案

River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6193   Accepted: 2685 Description Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a river. T

POJ3258 River Hopscotch —— 二分

题目链接:http://poj.org/problem?id=3258 River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15753   Accepted: 6649 Description Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully ju

【POJ3258】River Hopscotch 二分答案,贪心check

题意:第一行knm,有n+2个石头在数轴上(k是第n+2个石头离第一个的距离),要删掉m个,使两两间距的最小值最大,并求这个值. 题解:排序一下,然后扫一遍贪心决定删哪些. #include <cstdio> #include <cstring> #include <algorithm> #define N 50500 #define inf 0x3f3f3f3f using namespace std; int dist[N],n,m; int main() { //

POJ3258:River Hopscotch(二分)

Description 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 th

[ACM] POJ 3258 River Hopscotch (二分,最大化最小值)

River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6697   Accepted: 2893 Description Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a river. T

POJ 3258 River Hopscotch(二分求最小中的最大)

Description 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 th

POJ - 3258 River Hopscotch 二分

题目大意:给出河的宽度L和N块石头,现在要求移除M块石头,使得石头间的距离的最小值达到最大(起点和终点都有一块石头,但这两块石头不能移除) 解题思路:最小值的最大值,肯定用二分了 如果存在最优的距离,那么移走的石头数量肯定刚好是M块的 枚举的时候判断移除石头的数量,只需要从起点开始枚举,然后计算一下在最小跳跃距离内的石头有几个,有几个就移除几个,最后判断移除了多少个石头 如果移走的数量大于M,就表示所枚举的长度偏大 如果移走的数量小于M,就表示所枚举的长度偏小 有一种比较特殊的情况,就是N =

POJ - 3258 River Hopscotch(二分 最大化最小值)

大致题意: 坐标 从  [0-L], 上有 N 个点 , 现在需要移去 M 个点.求任意两点(包括0,L)点的距离中最小值的最大值 思路:枚举答案,若移去M个点不能达成目标,则使答案变小. while(l <= r){ ll mid = l + (r-l)/2; // 是否可能使得所有石头之间的距离不小于 mid if(check(mid)){ l = mid+1; }else{ r = mid-1; } } printf("%lld\n",l-1); 1 bool check(

POJ3258 River Hopscotch

地址 别人的代码,自己边界总是控制不好,还不知道哪里错了!思维!这种问题代码越简洁反而越不容易错吧.. 1 #include<stdio.h> 2 #include<algorithm> 3 typedef long long ll; 4 using namespace std; 5 ll n,m,L,a[100010]; 6 bool bi(ll x){ 7 ll i,cnt=0,now=0; 8 for(i=1;i<=n;i++){ 9 if(a[i]-a[now]<

bzoj1650 / P2855 [USACO06DEC]河跳房子River Hopscotch / P2678 (noip2015)跳石头

P2855 [USACO06DEC]河跳房子River Hopscotch 二分+贪心 每次二分最小长度,蓝后检查需要去掉的石子数是否超过限制. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define N 50010 7 int n,m,L,a[N]; 8 bool check(int