1. 程式人生 > >洛谷P1824 進擊的奶牛(二分列舉)

洛谷P1824 進擊的奶牛(二分列舉)

題解:二分列舉最大的最近距離。關鍵在於check函式的寫法,首先可以確定第一個欄可以放一個牛,然後根據列舉的距離來判斷是否能放cc頭牛,如果可以就繼續增大距離,否則就減小距離。

程式碼

#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; }