疯牛
时间限制:1000 ms | 内存限制:65535 KB
难度:4
-
描述
- 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1,000,000,000).
但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢?-
输入
- 有多组测试数据,以EOF结束。
第一行:空格分隔的两个整数N和C
第二行——第N+1行:分别指出了xi的位置
输出 - 每组测试数据输出一个整数,满足题意的最大的最小值,注意换行。 样例输入
-
5 3 1 2 8 4 9
样例输出
-
3
-
解题思路:我一开始的想法也是用二分,但不是二分长度,而是每次都插入两个位置之间,但是这样做会太绕。。。。这道题其实不需要这么麻烦,直接二分答案即可。。
-
AC:
-
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn = 100005; int pos[maxn],n,c; bool cmp(int a,int b) { return a < b; } bool judge(int len) { int cnt = 1, pre = 1; for(int i = 2; i <= n; i++) { if(pos[i] - pos[pre] >= len) { pre = i; cnt++; if(cnt == c) return true; } } return false; } void binary_search() { int l = 0, r = pos[n-1]-pos[0], mid, ans; while(l <= r) { mid = (l+r)>>1; if(judge(mid)) { l = mid + 1; ans = mid; } else r = mid - 1; } printf("%d\n",ans); } int main() { while(scanf("%d%d",&n,&c)!=EOF) { for(int i = 1; i <= n; i++) scanf("%d",&pos[i]); sort(pos+1,pos+1+n,cmp); binary_search(); } return 0; }
- 有多组测试数据,以EOF结束。

520

被折叠的 条评论
为什么被折叠?



