题目在这里 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;
	}
}