洛谷P1824 進擊的奶牛(二分列舉)
阿新 • • 發佈:2018-12-12
題解:二分列舉最大的最近距離。關鍵在於check函式的寫法,首先可以確定第一個欄可以放一個牛,然後根據列舉的距離來判斷是否能放頭牛,如果可以就繼續增大距離,否則就減小距離。
程式碼
#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;
}