解題報告 poj 2456 Aggressive cows

二分法查找位置

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
using namespace std;
int a[100005];
int n,c;
int distan(int d)//二分法查找到合適的距離
{
    int pre=0;
    for(int i=1;i<c;i++)
    {
        int now=pre+1;
        while(now<n&&a[now]-a[pre]<d)
            now++;
        if(now==n)return 0;//當最大距離爲d的時候並沒有把所有奶牛插入,不符合題意
        pre=now;//放入了當前的奶牛,位置向後移一位看能否放下下一頭奶牛
    }
    return 1;//奶牛全部安排好,當前的d符合題意
}
int main()
{
    while(~scanf("%d%d",&n,&c))
    {
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        sort(a,a+n);//第一隻牛一定是放在最小的a[i]上
        int l=0,r=1e9+5;//a[i]最大爲1e9
        while(r-l>1)
        {
            int mid=(l+r)/2;
            if(distan(mid))l=mid;//最大距離爲mid時符合條件,看能否找到更大的mid
            else r=mid;//不符合條件,縮小區間以實現縮小mid的值
        }
        printf("%d\n",l);//注意輸出的是l不是r,因爲一直滿足l<r,最後一次循環滿足條件的是較小的值
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章