题意:给定n个距离原点为i的栅栏,有多种方法选取k个栅栏将k头牛放入,每种方法中俩头牛的间距都有最小值,求出这些方法中此最小值的最大值
解法:二分查找
l为i最小值,r 为最大值,最大间隔为d=(l+r)/(k-1),得间隔区间(1,d)
对区间进行二分查找若当间隔最小值为mid时存在一种可实现方法其满足要求,若,l=r即整个区间已完成查找直接输出l或r即可,否则因需求最大值,继续到右区间寻找
否则到说明此mid较大,不满足要求,因到间隔最小值较小的左区间进行寻找
同时应避免二分查找出现死循环
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; const int N=100005; int n,c,x[N]; int bfind(); bool judge(int d); int main(){ scanf("%d%d",&n,&c); for(int i=1;i<=n;i++) scanf("%d",x+i); sort(x+1,x+n+1); printf("%d\n",bfind()); return 0; } int bfind(){ int l,r,mid; l=1; r=(x[n]-x[1])/(c-1); while(l<r){ mid=(l+r+1)/2; if(judge(mid)) l=mid; else r=mid-1; } return l; } bool judge(int d){ int i,a,count; a=x[1]; count=1; for(i=2;i<=n;i++){ if(x[i]-a>=d){ a=x[i]; count++; } if(count==c) return true; } return false; }