题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=586
分析:最大值最小,二分逼近
由于任何两头牛之间距离大于等于0,其最大距离不会超过arr[n-1]-arr[0],其中arr为栅栏的编号;利用二分不断逼近,直至最合理的值!
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 100010;
int n, num;
int arr[MAXN];
bool Judge(int dis)
{
int cnt = 1, iCurdis = arr[0];
for(int i = 1; i < n; ++i)
{
if(arr[i] - iCurdis >= dis)
{
cnt++;
iCurdis = arr[i];
if(cnt == num)
return true;
}
}
return false;
}
int Binary_Slove()
{
int l = 0, r = arr[n-1] - arr[0], mid;
while(l <= r)
{
mid = (l+r) >> 1;
if(Judge(mid))
l = mid+1;
else
r = mid-1;
}
return l-1;
}
int main()
{
int i;
while(~scanf("%d %d", &n, &num))
{
for(i = 0; i < n; ++i)
scanf("%d", &arr[i]);
sort(arr, arr+n);
printf("%d\n", Binary_Slove());
}
return 0;
}