题目在这里 http://acm.hdu.edu.cn/showproblem.php?pid=4004
以前我真的没怎么做过二分答案的。(鄙视我吧...)
显然这题的答案是一个单调序列,二分可以使复杂度为logn
代码:
//hdoj-4004 二分+验证
//1<= L <= 1000,000,000、0<= n <= 500,000、1<= m <= n+1
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 500002
int l, n, m;
int a[MAXN];
int check(int x)
{
int t = x;
int cnt=0;
for(int i=1; i<n+2; t=x) //点
{
while(t>=a[i]-a[i-1]) // i 表示下一个要跳过的点。
{
t-=a[i]-a[i-1];
i++;
}
cnt++;
if(cnt>m) return 0;
}
return 1;
}
int main()
{
while(cin>>l>>n>>m)
{
a[0]=0; a[n+1]=l;
for(int i=1; i<=n; i++) //n+2个点
{
cin>>a[i];
}
sort(a, a+n+2); //排序
int min=l%m? l/m+1: l/m;
int max = l;
while(min<max) // [min, max]
{
int mid = (min+max)/2;
if(check(mid))
{
max = mid;
}
else
{
min = mid+1;
}
} //当min=max 跳出
cout<<min<<endl;
}
}