牛客算法周周练10 E-跳石头(二分)

地址:https://ac.nowcoder.com/acm/contest/5986/E

解析:

二分最短距离,check出它所需要的修改次数。

check里注意,如果需要修改,那么last是不要变的,因为往后的a[i]-last即为去掉中间后的距离。

如果不需要修改,那么last需要变为a[i],因为a[i]之前的石头都已被搬掉,last只能变成a[i]了。

#include <cstdio>
#include<cstring>
#include<map>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=5e4+10;
int l,n,m;
int a[maxn];
bool check(int x)
{
    int last=0,cnt=0;
    for(int i=1;i<=n+1;i++)
    {
        if(a[i]-last<x)
            cnt++;
        else
            last=a[i];
    }
    if(cnt>m)
        return false;
        return true;
}
int main()
{
    cin>>l>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    a[n+1]=l;
    int ll=0,rr=l,x;
    while(ll<rr)
    {
        int md=(ll+rr+1)>>1;
        if(check(md))
        {
    //        x=md;            
            ll=md;
        }
        else
            rr=md-1;
    }
    cout<<rr<<endl;

}
原文地址:https://www.cnblogs.com/liyexin/p/13080891.html