二分三分
这一部分还是二分好用(因为二分好写)
三分在求非单调函数极值有大用
二分主要思路就是每次将当前区间分为两部分,当前接肯定在中点,左区间与右区间之中,那么把不合理的区间抛弃,就可以极快地求出解
例题:
愤怒的牛(很像跳石头)
农夫 John 建造了一座很长的畜栏,它包括N (2 ≤ N ≤ 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 ≤ xi ≤ 1,000,000,000). 但是,John的C (2 ≤ C ≤ N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢
二分答案,看当前答案是否合法即可
代码:
#include<bits/stdc++.h> using namespace std; int n,a[100020],m,f; inline int ok(const int &p){ int z=0,s=0; for(int i=1;i<n;i++){ if(a[i]-a[z]>=p){ s++; z=i; } if(s>=m-1) return 1; } return 0; } int main() { scanf("%d %d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); int l=0,r=a[n-1]-a[0],k,ans=0; while(l<=r){ k=(l+r)/2; if(ok(k)){ l=k+1; ans=k; } else r=k-1; } printf("%d\n",ans); return 0; }