# Binary Search# Greedy# Sorting

e616 - Aggressive cows

🔗 前往 ZeroJudge 原題

題目描述

題目要求在給定的 N 個隔間位置和 C 隻牛的情況下,找到牛之間的最大最小距離。換句話說,我們要找到一個距離 d,使得至少可以放置 C 隻牛,且任意兩隻牛之間的距離都大於等於 d。

解題思路

本題可以使用二分搜尋法來解決。首先,將隔間位置排序。然後,二分搜尋可能的最小距離範圍。對於每個可能的距離,檢查是否可以放置 C 隻牛,使得任意兩隻牛之間的距離都大於等於該距離。如果可以,則更新左邊界;否則,更新右邊界。最終,左邊界就是最大的最小距離。check(k) 函數用於判斷給定距離 k 是否可行,即是否可以放置 C 隻牛,使得任意兩隻牛之間的距離都大於等於 k。

複雜度分析

  • 時間複雜度: O(N log N + log(10^9)),其中 O(N log N) 是排序的時間複雜度,O(log(10^9)) 是二分搜尋的時間複雜度,每次二分搜尋需要 O(N) 的時間來檢查可行性。
  • 空間複雜度: O(N),主要用於儲存隔間位置。

程式碼

#include <iostream>
#include <algorithm>
using namespace std;
int a[100001],n,c;
inline bool check(int k){
	int tmp=c,s=0;
	for(int i=0;i<n;++i){
		if(a[i]>s){
			--tmp;
			s=a[i]+k;
			if(tmp<=0)return 1;
		}
	}
	return 0;
}
inline int ans(int l,int r){
	if(l>r)return l;
	int m=(l+r)/2;
	if(check(m)==0)
		return ans(l,m-1);
	else
		return ans(m+1,r);
}
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cin >> n >> c;
	for(int i=0;i<n;++i)
		cin >> a[i];
	sort(a,a+n);
	cout << ans(0,1000000000) << '\n' ;
}

Discussion