二分查找最小值

#include <algorithm>
#include <cstring>
#include <cstdio>
#define N 100010

using std:: sort;
int a[N];
int n,m;
int solve(int x)
{
    int cas=0;
    int nx=1;
    for(int i=2; i<=n; i++)
    {
        if(a[i]-a[nx]>=x)
        {
            cas++;
            nx=i;
        }
    }
  return cas+1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&n,&m);
        for(int i=1; i<=n; i++)
            scanf("%d",&a[i]);
        sort(a+1, a+n+1);
        int l=1,r=a[n-1]-a[0],mid;
        while(l+1<r)
        {
            mid=(l+r)/2;
            if(solve(mid)>=m)
            l=mid;
            else
            r=mid;
        }
        printf("%d\n",l);
    }
    return 0;
}
View Code

 

posted on 2013-08-03 20:10  风流monkey  阅读(183)  评论(0编辑  收藏  举报