POJ - 3258 River Hopscotch 二分

题目大意:给出河的宽度L和N块石头,现在要求移除M块石头,使得石头间的距离的最小值达到最大(起点和终点都有一块石头,但这两块石头不能移除)

解题思路:最小值的最大值,肯定用二分了

如果存在最优的距离,那么移走的石头数量肯定刚好是M块的

枚举的时候判断移除石头的数量,只需要从起点开始枚举,然后计算一下在最小跳跃距离内的石头有几个,有几个就移除几个,最后判断移除了多少个石头

如果移走的数量大于M,就表示所枚举的长度偏大

如果移走的数量小于M,就表示所枚举的长度偏小

有一种比较特殊的情况,就是N = M的情况,这种情况下枚举的很多长度都是符合的,但是答案只有一个,那就是L,所以移除数量等于M的时候不代表已经找到解了,应该再长度加1判断一下

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 50010
int pos[maxn], L, N, M;

void init() {

    for(int i = 0; i < N; i++)
        scanf("%d", &pos[i]);
    pos[N++] = L;
    pos[N++] = 0;
    sort(pos, pos + N);
}

bool judge(int mid) {
    int j = 0, cnt = 0;
    for(int i = 1; i < N; i++) {
        if(pos[i] - pos[j] < mid) {
            cnt++;
            if(cnt > M)
                return true;
            continue;
        }
        j = i;
    }
    return false;
}

int solve() {
    int l = 0, r = L;
    int ans = 0x3f3f3f3f;
    while(l <= r) {
        int mid = (l + r) / 2;
        if(judge(mid))
            r = mid - 1;
        else
            l = mid + 1;
    }
    return l - 1;
}

int main() {
    while(scanf("%d%d%d", &L, &N, &M) != EOF) {
        init();
        printf("%d\n",solve());
    }
    return 0;
}
时间: 2024-12-23 10:13:50

POJ - 3258 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

[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(二分 最大化最小值)

大致题意: 坐标 从  [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(

POJ 3258 River Hopscotch 经典二分

点击打开链接 River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6189   Accepted: 2683 Description Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a r

poj 3258 River Hopscotch 【二分】

题目真是不好读,大意如下(知道题意就很好解了) 大致题意: 一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L. 河中有n块石头,每块石头到S都有唯一的距离 问现在要移除m块石头(S和E除外),每次移除的是与当前最短距离相关联的石头,要求移除m块石头后,使得那时的最短距离尽可能大,输出那个最短距离. //Memory Time //420K 391MS #include<iostream> #include<algorithm> using

二分搜索 POJ 3258 River Hopscotch

题目传送门 1 /* 2 二分:搜索距离,判断时距离小于d的石头拿掉 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <cmath> 8 using namespace std; 9 10 typedef long long ll; 11 const int MAXN = 5e4 + 10; 12 const int INF = 0x3f3f3f3

POJ 3258 River Hopscotch (二分)

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

POJ 3258 River Hopscotch(二分 跳河)

Language: Default River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7990   Accepted: 3438 Description Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to