P1824 进击的奶牛
题解:二分枚举最大的最近距离。关键在于check函数的写法,首先可以确定第一个栏可以放一个牛,然后根据枚举的距离来判断是否能放 c c c头牛,如果可以就继续增大距离,否则就减小距离。
代码
#include<bits/stdc++.h>
using namespace std;
int a[100010],n,c;
bool ok(int d)
{
int now = a[0] ,ret = 1;
for(int i = 1; i < n; ++i){
if(a[i] - now >= d){
ret++;
now = a[i];
}
if(ret == c) break;
}
return ret >= c;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.in","r",stdin);
#endif
cin>>n>>c;
for(int i = 0; i < n; ++i){
cin>>a[i];
}
sort(a,a+n);
int r = 1e9+10, l = 1;
while(l <= r){
int mid = l + (r - l) / 2;
if(ok(mid))
l = mid + 1;
else
r = mid - 1;
}
if(ok(r)) l = r;
cout<<l<<endl;
return 0;
}