题意: 有n个牛栏,选m个放进牛,相当于一条线段上有 n 个点,选取 m 个点, 使得相邻点之间的最小距离值最大
思路:贪心+二分
二分枚举相邻两牛的间距,判断大于等于此间距下能否放进所有的牛。
#include<iostream> #include<algorithm> #include<cstdio> #define max 100005 using namespace std; int n,c,a[max]; bool judge(int d) { int index = 0, num=1; for(int i=1;i<n;i++){ if(a[i]-a[index]>=d){ index = i; num++; } if(num>=c) return true; } return false; } int main() { while(scanf("%d%d",&n,&c)!=EOF) { for(int i=0; i<n; i++) { scanf("%d",&a[i]); } sort(a,a+n); int l,r,ans; l = 1; r = a[n-1]-a[0]; ans = 0; while(l<=r) { int mid = (l+r)>>1; if(judge(mid)) { ans = mid; l = mid+1; } else { r = mid -1; } } cout<<ans<<endl; } return 0; }
原文地址:https://www.cnblogs.com/Lemon1234/p/11607132.html
时间: 2024-12-15 16:34:21