poj 3258 二分

题意:一条长为len(1<len<1,000,000,000)的河中,有n(1<n<50,000)块石头,移除m块,使具有最近距离的两块石头之间的距离最大。

分析:二分,上界为len,下界为当前最近的石头的间距。

对于二分的题目

若求的是最大值,while(low <= high) ...  if(check())... low=mid+1;  else high=mid-1;

若求的是最小值,while(low <   high) ...  if(check())... high=mid;  else low=mid+1;

答案均为 high

 

 

const int N = 50005;
int a[N];
int len, n, m;
int low, high;

bool check(int d){
    int s = a[0], cnt = 0;
    FOR(i, 1, n){
        if(a[i]-s < d) cnt++;
        else s = a[i];
    }
    if(cnt > m) return false;
    return true;
}

int main(){
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    #endif

    scanf("%d%d%d", &len, &n, &m);
    FOE(i, 1, n) scanf("%d", &a[i]);
    a[0]=0; a[n+1]=len;
    n += 2;
    sort(a, a+n);

    low = -1; high = len;
    FOR(i, 1, n) checkmin(low, a[i]-a[i-1]);

    while(low <= high){
        int mid = (low + high) / 2;
        if( check(mid) ) low = mid+1;
        else high = mid-1;
    }

    printf("%d\n", high);

    return 0;
}

 

posted @ 2013-05-21 21:27  心向往之  阅读(124)  评论(0编辑  收藏  举报