二分三分

这一部分还是二分好用(因为二分好写

三分在求非单调函数极值有大用

二分主要思路就是每次将当前区间分为两部分,当前接肯定在中点,左区间与右区间之中,那么把不合理的区间抛弃,就可以极快地求出解

例题:

愤怒的牛(很像跳石头)

农夫 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;
}

 

posted @ 2019-06-09 11:17  _Alex_Mercer  阅读(220)  评论(0编辑  收藏  举报