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