zoukankan      html  css  js  c++  java
  • 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
    ",l);
        }
        return 0;
    }

    2018-09-21

  • 相关阅读:
    浏览器同源政策及其规避方法---转阮大神
    js跨域详解
    js中top、self、parent
    杂记
    DOM 踩踩踩
    java idea 连接数据库
    数据库mySQL常用命令
    用迭代实现80人围成一圈逢3取出
    如何把通过类建立的对象存入数组中.
    面向对象编程
  • 原文地址:https://www.cnblogs.com/00isok/p/9689002.html
Copyright © 2011-2022 走看看