poj 3258(二分)

题意:有牛要过河,河宽为l,上面有n块石头,要求拿走m块石头后,让相邻两个石头的最小距离最大(假设两岸也有石头但无法取走)。

题解:二分出距离然后拿去判断。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 50005;
int l, n, m, pos[N];

bool judge(int x) {
    int cnt = 0, cur = 0;
    for (int i = 1; i <= n; i++) {
        while (i <= n && pos[i] - pos[cur] < x) {
            i++;
            if (cnt >= m)
                return false;
            cnt++;
        }
        cur = i;
    }
    if (l - pos[cur] < x)
        return false;
    return true;
}

int main() {
    while (scanf("%d%d%d", &l, &n, &m) == 3) {
        for (int i = 1; i <= n; i++)
            scanf("%d", &pos[i]);
        sort(pos + 1, pos + n + 1);
        pos[0] = 0;
        int left = 0, right = l;
        while (left < right) {
            int mid = (left + right + 1) / 2;
            if (judge(mid))
                left = mid;
            else
                right = mid - 1;
        }
        printf("%d\n", left);
    }
    return 0;
}
时间: 2024-10-06 09:46:58

poj 3258(二分)的相关文章

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 (二分)

题目地址: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 二分答案

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

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

二分搜索实例 ,先排序,算出每一个石头的间隔,从l和最小间隔中二分找答案 #include <iostream> #include <algorithm> using namespace std; int a[50010],n,m; bool cmp(int a,int b){ return a<b; } int test(int D) { int i,t=0,k=0; for (i=0;i<n+1;i++) { t+=a[i]; if (t<D) k++; el

poj 3258 River Hopscotch 题解

[题意] 牛要到河对岸,在与河岸垂直的一条线上,河中有N块石头,给定河岸宽度L,以及每一块石头离牛所在河岸的距离, 现在去掉M块石头,要求去掉M块石头后,剩下的石头之间以及石头与河岸的最小距离的最大值. [解法] 用二分做,但是开始写了三个版本的二分,全都wa. 无赖看了别人的二分,还是不理解,为什么他们写的就能过. 反复思索后,终于明白了:关键在于题目求的是什么. 做题思想:二分所求的最小距离的最大值mid,记录可以去掉的石头块数cnt(注意:当相邻的石头的距离小于等于mid,就可以去掉),

二分搜索 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 3525 二分+半平面交

Most Distant Point from the Sea Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3812   Accepted: 1779   Special Judge Description The main land of Japan called Honshu is an island surrounded by the sea. In such an island, it is natural 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