POJ 3258 River Hopscotch (最大最小距离)【二分】

<题目链接>

题目大意:
现在有起点和终点两个石块,这两个石块之间有N个石块,现在对这N个石块移除M个石块,使得这些石块之间的最短距离最大,注意,起点和终点这两个石块不能被移除。

解题分析:

二分答案典型题,二分最大的最短距离,然后根据这个最短距离对这些石块从左向右进行判断,用一个last记录每一次判断的起点,如果当前石块到last的距离<=最短距离,说明该木块需要被移除。对于最后一个石块,由于最后一个石块不能被移除,所以加入最后一个石块到last的距离<=mid,那么就直接移除last即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int  M = 50000+100;
ll arr[M],L,n,m;

bool juge(ll x){
    ll last=0,del=0;
    for(int i=1;i<=n;i++){
        if(arr[i]-last<=x)del++;   //如果当前石块到记录的石块距离<=x,则移除当前石块
        else last=arr[i];
    }
    if(L-last<=x)del++;   //如果last所记录的石块到终点的距离<=x,则移除该记录石块(因为终点的石块不能被移除)
    return del<=m;
}

int main(){
    while(scanf("%lld%d%d",&L,&n,&m)!=EOF){
        for(int i=1;i<=n;i++){
            scanf("%lld",&arr[i]);
        }
        sort(arr+1,arr+1+n);
        ll l=0,r=L;
        while(l<=r){
            ll mid=(l+r)>>1;
            if(juge(mid))l=mid+1; //由于要最大的最短距离,所以在符合条件的情况下,尽可能的让最短距离更大
            else r=mid-1;
        }
        printf("%lld\n",l);
    }
    return 0;
}

2018-09-21

原文地址:https://www.cnblogs.com/00isok/p/9689002.html

时间: 2024-10-05 05:50:12

POJ 3258 River Hopscotch (最大最小距离)【二分】的相关文章

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 二分答案

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 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(二分&#183;最小距离最大)

题意  一条河两岸之间有n个石头  求取走m个石头后  使得两个石头间距离的最小值最大 感觉关键是理解题意  简单的二分  二分最小距离  看要取走多少个(cnt)石头  cnt<=m的话 说明最小距离还可以增大  这样就可以二分出答案了 #include <cstdio> #include <algorithm> using namespace std; const int N = 50005; int p[N], l, n, m; bool ok(int k) { int

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

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

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

POJ 3258 River Hopscotch(二分)

River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8975   Accepted: 3859 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