跳石头

来源:互联网 发布:淘宝怎么用银行卡分期 编辑:程序博客网 时间:2024/03/29 02:39

QAQ
话说我把变量弄错了,,,,,,,,
二分最小距离
如果距离小于最小距离的石子,也就是删去的石子的个数小于或者是等于m
证明最小距离取小了
反之则是最小距离取大了
把终点当做最后一个石子处理
需要注意在m==n的时候要特判,直接输出l

#include <cstdio>#include <iostream>#include <algorithm> #include <cstring>using namespace std;int a[99999];int d[99999];   int n,m,l;int check(int mid){    int ans=0;    int last=0;     for(int i=1;i<=n;i++)     if(a[i]-a[last]<mid)  ans++;     else                  last=i;    return ans<=m;}int main(){    scanf("%d%d%d",&l,&n,&m);    a[++n]=l;    for(int i=1;i<n;i++)    {        scanf("%d",&a[i]);    }    if(m==n-1)    {        printf("%d",l);        return 0;    }    int lf=1,rt=l;    while(lf+1<rt)    {        int mid=(lf+rt)>>1;        if(!check(mid))         rt=mid;        else lf=mid;    }    printf("%d",lf);        return 0;}
原创粉丝点击