跳石头

题目:

https://www.luogu.com.cn/problem/P2678

第一行包含三个整数 L,N,ML,N,M,分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多移走的岩石数。保证 L \geq 1L1 且 N \geq M \geq 0NM0。

接下来 NN 行,每行一个整数,第 ii 行的整数 D_i( 0 < D_i < L)Di(0<Di<L), 表示第 ii 块岩石与起点的距离。这些岩石按与起点距离从小到大的顺序给出,且不会有两个岩石出现在同一个位置。

输出格式

一个整数,即最短跳跃距离的最大值。

 

二分距离,要把起点和终点算进去

#include<iostream>
#include<string.h>
using namespace std;
const int maxn=5e4+7;
int a[maxn],b[maxn];
int L,n,m;
int ju(int x,int w)
{
 memcpy(b,a,sizeof(a));
    int i;
   b[0]=0;
   for(i=1;i<=n&&w>=0;i++)
   {
       if(b[i]-b[i-1]<x)
       {
           b[i]=b[i-1];
           w--;
       }
   }
   if(L-b[n]<x)
   {
       return 0;
   }
   // cout<<"x="<<x<<endl;
     //cout<<"i="<<i<<" "<<"w="<<w<<endl;

     if(i>n&&w>=0)
     return 1;
     else
        return 0;
}
int main()
{
    cin>>L>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    int l=1,r=L;
    while(l<r)
    {
        int mid=(l+r+1)/2;
        if(ju(mid,m))
            l=mid;
        else
            r=mid-1;
    }
    cout<<l<<endl;
}

 

posted @ 2021-07-16 20:57  废柴废柴少女  阅读(57)  评论(0)    收藏  举报