本題採取了二分查找法與貪心算法相結合的思想解題
/*
描述
農夫 John 建造了一座很長的畜欄,它包括N (2 <= N <= 100,000)個隔間,這些小隔間依次編號爲x1,...,xN (0 <= xi <= 1,000,000,000).
但是,John的C (2 <= C <= N)頭牛們並不喜歡這種佈局,而且幾頭牛放在一個隔間裏,他們就要發生爭鬥。爲了不讓牛互相傷害。John決定自己給牛分配隔間,使任意兩頭牛之間的最小距離儘可能的大,那麼,這個最大的最小距離是什麼呢?
輸入
有多組測試數據,以EOF結束。
第一行:空格分隔的兩個整數N和C
第二行——第N+1行:分別指出了xi的位置
輸出
每組測試數據輸出一個整數,滿足題意的最大的最小值,注意換行。
樣例輸入
5 3
1
2
8
4
9
樣例輸出
3
*/
#include <stdio.h>
#include <stdlib.h>
int n,c;
int a[100002];
int cmp(const void *a,const void *b)
{
int *c=(int *)a;
int *d=(int *)b;
return *c-*d;
}
int main()
{
int i,p,q,middle;
while(scanf("%d%d",&n,&c)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
qsort(a,n,sizeof(a[0]),cmp);
if(c==2)
{
printf("%d\n",a[n-1]-a[0]);//當只有兩頭牛的時候一個放最前面 一個放最後面 間距最大
}
else
{
p=1;
q=a[n-1]-a[0];
while(q-p>1)
{
middle=(p+q)/2;//間距的一半,即中間值
int j=0;
int count=1;
for(i=0;i<n;i++)
{
if(a[i]-a[j]>=middle)
{
j=i;
count++;//count記錄能放置下的牛的數量
}
}
if(count>=c)
{
p=middle;//符合得情況下證明此中間值取得相對較小了 將它作爲頭
}
else
{
q=middle;//此情況下證明此中間值取得相對較大了 將它作爲尾
}
}
printf("%d\n",p);//最後結束的時候p對應的爲最合適的間距值
}
}
return 0;
}
/*
先將輸入的房間號進行從小到大排列,然後計算得出間距範圍(題中爲1-8),對間距範圍採取二分法的快速查找方式,從第一個房間開始,
查找對應符合間距大小的房間,繼而判斷出最符合的間距大小
*/