[洛谷][二分搜索]进击的奶牛

进击的奶牛

Description

Farmer John建造了一个有N(2<=N<=100,000)个隔间的牛棚,这些隔间分布在一条直线上,坐标是x1,...,xN (0<=xi<=1,000,000,000)。

他的C(2<=C<=N)头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?

Input

第1行:两个用空格隔开的数字N和C。

第2~N+1行:每行一个整数,表示每个隔间的坐标。

Output

输出只有一行,即相邻两头牛最大的最近距离。

Examples

Input

5 3
1 
2 
8 
4 
9 

Output

3

正确解法:

求最大距离中的最小值。

通过推测,第一只奶牛一定在第一个棚子里,他们中间的最大距离为 a[n]-a[1],最少有两只奶牛,最大距离为牛棚的两端。

当然这是最极限的情况,基本不可能发生。

另一个极限情况是奶牛都挤在一起。最小距离为1.

从1到a[n]-a[1] 开始查找,首先是中间值开始找,如果符合条件,就中间值往后,不符合就中间值之前。

符合条件:

第一只牛在第一个棚子,第二只牛至少在 上一只牛+m 位置的棚子里。更新上一只牛的位置。

最后求最多能放多少只牛。

如果牛的数量大于 c (现有牛的数量)  那就符合条件。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<cmath>
 6 #include<algorithm>
 7 using namespace std;
 8 int n, c;
 9 int a[100010];
10 bool judge(int x)
11 {
12     int ans = 1,last=1;
13     for (int i = 2; i <= n; i++)
14     {
15         if (a[i] - a[last] >= x)
16         {
17             ans++;
18             last = i;
19         }
20     }
21     if (ans >= c)    return 1;
22     return 0;
23 }
24 int main()
25 {
26     cin >> n >> c;
27     for (int i = 1; i <= n; i++)
28         cin >> a[i];
29     sort(a + 1, a + n + 1);
30     int l = 1, r = a[n] - a[1];
31     while (l <= r)
32     {
33         int mid = (l + r) / 2;
34         if (judge(mid))    l = mid + 1;
35         else r = mid - 1;
36     }
37     cout << r << endl;
38     return 0;
39 }
View Code
No matter how you feel, get up , dress up , show up ,and never give up.
原文地址:https://www.cnblogs.com/Kaike/p/9925313.html