一个不错的二分,注释在代码里
#include <stdio.h> #include <cstring> #include <algorithm> #include <cmath> #include <iostream> using namespace std; ///二分搜索答案,最大化最小值 int main() { int L,n,m; int a[50010]; while(~scanf("%d %d %d",&L,&n,&m)) { for(int i = 1; i <= n; i++) scanf("%d",&a[i]); a[0] = 0; a[n+1] = L; sort(a,a+n+2); /*for(int i = 0;i <= n+1;i++) cout<<a[i]<<" "; cout<<endl;*/ int l = 0,r = L,mid; ///先模拟一个最小值mid,假设它就是正确答案 int num; while(l <= r) { int last = 0; int sum = 0; mid = (l + r) / 2; for(int i = 1; i <= n+1; i++) { if(a[i] - a[last] < mid)///如果比mid小,就将该节点强制删除,并计数 sum++; else last = i;///如果不是就更新,为啥要更新,如果不更新,那我们计算的 ///就不是两点之间的距离了啊 } if(sum > m)///删多了,说明mid值偏大 r = mid - 1; else { l = mid + 1; num = mid; } } ///最后经过二分循环,得到最大的mid; printf("%d ",num); } return 0; }