进击的奶牛
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 }