POJ 2456 Aggressive cows


题意:N个点,坐标分别为:x1,x2...xn,从中选择C个点,使这C个点的位置间的最小距离最大。

分析:二分+贪心。


Source Code:

#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn=100010;
int pos[maxn];
int n,c;

bool OK(int w){
    int sum=1,cur=pos[0];
    for(int i=1;i<n;i++){
        if(pos[i]-cur>=w){
            sum++;
            if(sum>=c) return true;
            cur=pos[i];
        }
    }
    return false;
}

int bin_search(){
    int l=0,r=pos[n-1]-pos[0];
    while(l<=r){
        int m=(l+r)/2;
        if(OK(m)) l=m+1;
        else      r=m-1;
    }
    return l-1;
}

int main()
{
    while(scanf("%d %d",&n,&c)==2){
        for(int i=0;i<n;i++)
            scanf("%d",&pos[i]);
        sort(pos,pos+n);
        printf("%d\n",bin_search());
    }
    return 0;
}


你可能感兴趣的:(POJ 2456 Aggressive cows)