题目::Aggressive cows
农夫 John 建造了一座很长的畜栏,它包括N (2≤N≤100,000)个隔间,这些小隔间的位置为x0,…,xN-1 (0≤xi≤1,000,000,000,均为整数,各不相同).John的C (2≤C≤N)头牛每头分到一个隔间。牛都希望互相离得远点省得互相打扰。怎样才能使任意两头牛之间的最小距离尽可能的大,这个最大的最小距离是多少呢?
思路:
二分距离范围,贪心距离是否满足题意
1.一组数的最大距离就是最小数和最大数的差值,这也是两头牛之间最大的最小距离,我们可以暴力一点,直接分割这个最大的最小距离,两头牛最小的最小距离就是1了,不过这样会超时,所以,我们可以选择二分距离。
2.找出某个距离后,我们需要测试一下这个距离符不符合要求,能够有>=C头牛放下,所以,我们利用贪心来进行判断,这里我会在代码里说明。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
int a[1000007];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,c;
scanf("%d %d",&n,&c);
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);//贪心第一步,排序。
int l=0,r=a[n-1];
int mid,cnt;
int best=0;
while(l<=r)//二分距离 距离的范围在[0,a[n-1]]
{
cnt=1;
mid=(l+r)/2;
int ben=a[0];
for(int j=1; j<n; j++)//判断此距离是否符合要求
{//这里就利用了贪心的思想,我们排完序后,最优化的情况就是相邻之间判断距离和我们选出的距离关系,相邻之间小于选出的距离,就看加上下一个的距离,这样判断就是最优化的。
if(ben+mid<=a[j]) {//理解这一步!!!!!!
cnt++;
ben=a[j];//每次确定一个房子,就要即使更新。
}
if(cnt>=c) break;
}
if(cnt<c) {
r=mid-1;
}else {
l=mid+1;
best=mid;
}
}
printf("%d\n",best);
}
}