NYOJ 586.疯牛(二分枚举+贪心)

/*
描述
农夫 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
*/


/*
分析:通过二分枚举这个最小值,然后通过贪心的思想找出满足要求的最大的这个最小值
二分枚举 + 贪心
用二分枚举满足条件的最大距离,依次做相应判断。本题不需要担心最后求出的距离不能适应题目中的隔间间的距离,
因为二分枚举之后是按照贪心发判断的,如果当前距离满足要求,会继续增大枚举的距离,一直到无法满足要求为止,
即最后结果一定满足是隔间间的距离。




另外注意理解最大的最小距离(最小距离的最大值),这句话到底是什么意思呢?
根据例子来理解下:
有5组数:
1   5   6    7    9    12
2   6   7    9    15   20
4   8   10   15   21   25
6   8   11   12   20   26
9   12  15   16   23   30
这5组数每组都会有一个最小值,分别是1 2 4 6 9这5个数,那么最小值得最大值便是这5个数的最大值,就是9。
最大的最小距离,就是这样理解的。


这道题的就是5个房间里放3头牛,共有好几种方法,求这几种方法的符合题意的方法。
*/
#include  
#include
#include 
using namespace std; 
int a[100005],n,c;  
int judge(int mid)  
{  
    int i,count=1,t=a[0]; //count是指放了几头牛,从1开始。t用来表示当前的房间号
    for(i=1;i=mid)//判断两个房间之间的距离 
		{  
			count++;
			t=a[i];//修改t的值,即修改当前房间号,例如原来t=1,a[2]=4,若a[2]-t>=mid符合,那么t=4,然后算a[3]或者a[4]与t之间的距离。  
			if(count>=c)//可以放下C头牛  
				return 1;  
		}
	}  
    return 0;
}  
int binary()//二分搜索符合条件的最小距离的最大值  
{  
    int low=0,high=a[n-1]-a[0],mid;  
    while(low<=high)  
    {  
        mid=(low+high)/2;//mid即为最小房间号与最大房间号之间的距离  
        if(judge(mid))  
            low=mid+1; //所求距离>=mid,可以继续增大试探 
        else  
            high=mid-1;//所求距离



你可能感兴趣的:(贪心算法)