3
//大意是先让每个牛牛之间的距离尽可能的大,然后再找出这些距离中最小的那个值。
//思路
用个二分加贪心
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int a[100005],n,c; int chack(int x) { int sum=1,t=a[0]; for(int i=1;i<n;i++) { if(a[i]-t>=x) { sum++; t=a[i]; if(sum>=c)///先找出比中间值大的数看是否符合牛牛的个数如果大,则证明所求的最小距离一定在中间值之后,反之之前,一次一次缩短距离。
return 1; } } return 0; } int erfen() { int e=0,f=a[n-1]-a[0]; while(e<=f) { int mind=(e+f)/2; if(chack(mind)) e=mind+1; else f=mind-1; } return e-1; } int main() { while(scanf("%d%d",&n,&c)!=EOF) { for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n);//找出牛牛们间隔的最大距离 这样最小的一定在最大距离和0之间。 printf("%d\n",erfen()); } }
