hdu 4004

来源:互联网 发布:golang程序员工资 编辑:程序博客网 时间:2024/05/19 22:28

题目

题目大意:青蛙要跳过长为L的河,中间有n个石头供他休息,但它只能跳m次,问这m次里所跳距离最大值的最小可能


想法:先把石头排序,算出相邻石头的距离b,然后就等价于,把b序列分成m段,对于每一段和的最大值最小化.

        二分答案,显然答案在max(b[i])和l之间,我们只需要判断当答案是mid时,把序列分成了多少段逐渐二分


#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define N 500005int l,n,m,a[N],b[N],s,t;int main(){    while(~scanf("%d%d%d",&l,&n,&m))    {        s=0,t=l;        a[0]=0,a[n+1]=l;        for(int i=1;i<=n;i++) scanf("%d",&a[i]);        sort(a,a+n+2);        for(int i=0;i<=n;i++) b[i]=a[i+1]-a[i],s=max(s,b[i]);        while(s<t)        {            int cnt=0,sum=0,mid=(s+t)>>1;            for(int i=0;i<=n;i++)            {                sum+=b[i];                if(sum>mid)                {                    cnt++;sum=b[i];                }            }            if(cnt<m) t=mid;            else s=mid+1;        }        printf("%d\n",s);    }}


原创粉丝点击