牛客-愤怒的牛

题目链接
服了啊二分,细节怪。至于代码中的为啥是while(l<=mid)我也不清楚,还有那个mid=l+((r-l)>>1)放while循环下的第一句的话也是错的,搞不懂!!!这种mid写法是为了防溢出
二分好文:大佬文章

#include
using namespace std;
//#define int long long
const int N=1e5+10;
int n,m,ma,mi=0x3f3f3f3f;
int a[N];
int check(int val) {
    int cnt=1;///a[0]放第一个牛
    int sta=a[1]+val;///是a[1],数组从1开始的
    for(int i=2; i<=n; i++) {
        if(a[i]>=sta) {///a[i]放牛
            sta=a[i]+val;///下一个位置
            cnt++;
        }
        if(cnt>=m)return 1;
    }
    return 0;
}
int main() {
    cin>>n>>m;
    for(int i=1; i<=n; i++) {
        cin>>a[i];
        ma=max(ma,a[i]);
        mi=min(mi,a[i]);
    }
    sort(a+1,a+1+n);
    int r=(ma-mi+1)/m,l=1;///左闭右开型
    int mid=l+((r-l)>>1);
    ///防溢出
    while(l<=mid) {
        if(check(mid)) { ///mid够放m头牛。试着往大调
            l=mid+1;
        } else {
            r=mid-1;
        }
        mid=l+((r-l)>>1);
    }
    cout<<mid<<endl;
}

你可能感兴趣的:(算法)