二分贪心——E

题目要求:

建立一个新的长谷仓,N(2 <= N <= 100,000)摊位。档位位于x1,...,xN(0 <= xi <= 1,000,000,000)的直线上。 
C(2 <= C <= N)母牛不喜欢这个谷仓布局,并且一旦进入摊位就变得彼此侵略。为了防止奶牛相互伤害,将奶牛分配给摊位,使其中任何两个之间的最小距离尽可能大。

题目思路:

输入摊位后进行从小到大排序,定义上下限,下限为0,上限为摊位最大值减最小值,循环处理,取上下限的1/2为m,判断摊位之间的距离值是否符合小于m,重复测试,输出最下限。

#include 
#include 
#include 
using namespace std;
int a[100005];
int N,C;
bool s(int m)
{
	int x=0,i,n;
	for(i=1;i<C;i++)
	{
		 n=x+1;
		while(n<N&&a[n]-a[x]<m)
		 n++;
		if(n==N)
			return 0;
		 x=n;
		 }
	return 1;
}
int main()
{
	cin>>N>>C;
	for(int i=0;i<N;i++)
		scanf("%d",&a[i]);
	sort(a,a+N);
	int l=0,h=a[N-1]-a[0];
	for(int i=0;i<100;i++)
	{ 
		int m=(l+h)/2;
		if(s(m))
			l=m;
		else h=m;
	}
	cout<<l<<endl;
	return 0;

感悟:找准上下限以及判断方式二分程序就能完成一半了。

你可能感兴趣的:(二分贪心——E)