跳石头

来源:互联网 发布:网络教育要多少钱 编辑:程序博客网 时间:2024/06/11 05:51

二分答案加贪心
和之前一个丢瓶盖一样,对去几个石子二分,去多了就取大了,去少了就取小了

#include<cstdio>#include<iostream>#include<cstring>#define ll long longusing namespace std;ll a[99999],n,m,l,dp[51999],f,d[99999];int check(int x){    int ans=0;    int t=d[1];    for(int i=1;i<=n;i++)    {        if(t>=x){            t=d[i+1];        }        else         {        ans++;            t+=d[i+1];        }    }    return ans;}int main(){    scanf("%lld%lld%lld",&l,&n,&m);    if(m==n||m==0){        printf("%lld",l);        return 0;    }    a[0]=1;    a[n+1]=l;    for(ll i=1;i<=n+1;i++)    {        scanf("%lld",&a[i]);        d[i]=a[i]-a[i-1];    }    /*memset(dp,127,sizeof(dp));    for(ll i=1;i<=n+1;i++)        for(ll j=1;j<=m;j++)        for(ll k=1;k<=j;k++)        {            ll q=min(dp[j],a[i]-a[i-k]);            ll w=min(dp[j-k],a[i+1]-a[i-k]);            dp[j]=max(q,w);        }    printf("%lld",dp[m]);*/    int r=l,le=1;    while(le<=r){        int mid=(le+r)>>1;        int w=check(mid);        //printf("%d ",w);        if(w>m)        r=mid-1;        else  le=mid+1;    }    printf("%d",r);    }