POJ 2456 Aggressive cows(二分答案,最大化最小值)

来源:互联网 发布:初学者吉他知乎 编辑:程序博客网 时间:2024/06/05 11:00

题目链接
题意:给出n个牛舍坐标(在一直线上),然后有m个牛要入住,现在问相邻牛之间的最小距离最大是几
解答:二分答案,函数ok(d)检查距离是d合法与否

#include<cstdio>#include<algorithm>//#include<bits/stdc++.h>using namespace std;#define LL long long#define pb push_back#define X first#define Y second#define cl(a,b) memset(a,b,sizeof(a))typedef pair<long long ,long long > P;const int maxn=100005;const LL inf=1LL<<45;const LL mod=1e9+7;LL a[maxn];int n,m;bool ok(int d){    int last=0;    for(int i=1;i<m;i++){        int cur=last+1;        while(cur<n&&a[last]+d>=a[cur])cur++;        if(cur==n)return false;        last=cur;    }    return true;}void solve(){    int l=0,r=999999999;    while(r-l>1){        int mid=(l+r)/2;        if(ok(mid))l=mid;        else r=mid;    }    printf("%d\n",r);}int main(){    while(~scanf("%d%d",&n,&m)){        for(int i=0;i<n;i++){            scanf("%lld",&a[i]);        }        sort(a,a+n);        solve();    }    return 0;}
0 0