spoj 297

就是对距离进行二分找最大值 ....

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

int a[100010];
int n,C;
bool can(int lim)
{
    int d = 0,w = 1;
    for(int i = 1; i < C; i++)
    {
        while(a[w]-a[d] < lim && w < n)
            w++;
        if(w >= n)
            return false;
        d = w;
    }
    return true;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&C);
        for(int i = 0; i < n; i++)
        {
            scanf("%d",&a[i]);
        }
        sort(a, a+n);
        int l = 1,r = a[n-1];
        while(l +1 < r)
        {
            int mid = (l+r)/2;
            if(can(mid))
                l = mid;
            else
                r = mid;
        }
        printf("%d\n",l);
    }
    return 0;
}


posted @ 2013-08-03 16:45  xlc2845  阅读(111)  评论(0)    收藏  举报