题目要求:
建立一个新的长谷仓,N(2 <= N <= 100,000)摊位。档位位于x1,...,xN(0 <= xi <= 1,000,000,000)的直线上。
C(2 <= C <= N)母牛不喜欢这个谷仓布局,并且一旦进入摊位就变得彼此侵略。为了防止奶牛相互伤害,将奶牛分配给摊位,使其中任何两个之间的最小距离尽可能大。
题目思路:
输入摊位后进行从小到大排序,定义上下限,下限为0,上限为摊位最大值减最小值,循环处理,取上下限的1/2为m,判断摊位之间的距离值是否符合小于m,重复测试,输出最下限。
#include <iostream>
#include <stdio.h>
#include <algorithm>
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;
}
感悟:找准上下限以及判断方式二分程序就能完成一半了。