简单二分求解(木板补漏问题)

#include<stdio.h>
//https://vjudge.net/contest/208065#problem/I
//你可以用k块木板修理天花版,求最长木板的最小值。
//二分求解
//二分:木板的长度为某个值时需要多少木板。
long long s[100050];
long long n,k;
long long num(long long a)//最长长度为a时要多少快木板
{
long long i,j,begin;
j=1;//木板数
begin=0;//填洞起点
for(i=1;i<n;i++)
{
if(s[i]-s[begin]+1>a)
begin=i,j++;
}
return j;
}
int main()
{
int t;
scanf("%d",&t);
//printf("t%d\n",t);
while(t>0)
{
t--;
long long l,r;
long long i,j;
scanf("%lld%lld",&n,&k);
for(i=0;i<n;i++)
scanf("%lld",&s[i]);
l=0,r=s[n-1]-s[0]+1;
while(r-l>1)
{
long long a,b;
a=(r+l)/2;
b=num(a);
if(b<=k)//木板可以更短
r=a;
else
l=a;//更长
//printf("%lld %lld\n",l,r);
}
printf("%lld\n",r);
}
return 0;
}

posted @ 2018-01-25 14:57  cglong  阅读(126)  评论(0编辑  收藏  举报