nyoj586 瘋牛

本題採取了二分查找法與貪心算法相結合的思想解題

/*
描述
農夫 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),對間距範圍採取二分法的快速查找方式,從第一個房間開始,
查找對應符合間距大小的房間,繼而判斷出最符合的間距大小
*/



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