题目描述
Farmer John 建造了一个有 N$(2 ≤ N ≤ 100000) $个隔间的牛棚,这些隔间分布在一条直线上,坐标是 x 1 , . . . , x N ( 0 ≤ x i ≤ 1000000000 ) x_1 ,...,x_N (0 ≤ x_i ≤ 1000000000) x 1 , . . . , x N ( 0 ≤ x i ≤ 1 0 0 0 0 0 0 0 0 0 ) 。
他的 $C(2 ≤ C ≤ N) $头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John 想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?
输入格式
第 1 行:两个用空格隔开的数字 N和 C。
第 2 ~ N+1 行:每行一个整数,表示每个隔间的坐标。
输出格式
输出只有一行,即相邻两头牛最大的最近距离。
代码编写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 #include <bits/stdc++.h> using namespace std;int N;int C;int x[100001 ];bool judge (int d) { int lastCowPos = x[1 ]; int remainCowCount = C - 1 ; for (int i=2 ;i<=N;i++){ if (x[i] - lastCowPos>=d){ remainCowCount--; lastCowPos = x[i]; } if (remainCowCount <= 0 ){ return true ; } } return false ; } int main () { cin>>N>>C; for (int i=1 ;i<=N;i++) cin>>x[i]; sort (x+1 ,x+1 +N); int l = 1 ; int r = x[N] - x[1 ]; while (l<=r) { int mid = (l+r) / 2 ; if (judge (mid)){ l = mid+1 ; }else { r = mid - 1 ; } } cout<<r<<endl; return 0 ; }