码迷,mamicode.com
首页 > 其他好文 > 详细

疯牛(二分)

时间:2015-11-13 23:27:21      阅读:346      评论:0      收藏:0      [点我收藏+]

标签:

疯牛

时间限制: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
题解:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 typedef long long LL;
 8 const int MAXN=1e5+100;
 9 int m[MAXN];
10 int N,C;
11 bool js(int x){
12     int t=m[0];
13     int cnt=0;
14     for(int i=1;i<N;i++){
15         if(m[i]-t>=x)cnt++,t=m[i];
16     }
17     if(cnt>=C)return true;
18     else return false;
19 }
20 int erfen(int l,int r){
21     int mid;
22     while(l<=r){
23         mid=(l+r)/2;
24         if(js(mid))r=mid-1;
25         else l=mid+1;
26     }
27     return l;
28 }
29 int main(){
30     while(~scanf("%d%d",&N,&C)){
31         for(int i=0;i<N;i++)scanf("%d",m+i);
32         sort(m,m+N);
33         printf("%d\n",erfen(0,m[N-1]-m[0]));
34     }
35     return 0;
36 }

 

疯牛(二分)

标签:

原文地址:http://www.cnblogs.com/handsomecui/p/4963431.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!