NYOJ 586 疯牛 (二分搜索答案)

来源:互联网 发布:贪吃蛇大战下载软件 编辑:程序博客网 时间:2024/05/22 06:53

疯牛

时间限制: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 312849
样例输出
3

题意:给出n个x轴上的坐标,选取c个坐标,使得这c个坐标中任意相邻两个坐标间的最小值最大化。

思路:最大化最小值,看到这个一般就是二分的题目,在[0, max]之间二分搜索答案即可。

代码如下:

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;int n, c;int a[100005];bool check(int x){//判断让x为最小距离是否可行 int cnt = 0, now;for(int i = 1; i <= n; i++){if(i == 1){cnt++;now = a[i];}else if(a[i] - now >= x){cnt++;now = a[i];}}if(cnt >= c)return true;return false;}int binarySearch(){//二分搜索 int l = 0, r = a[n], mid;while(l + 1 < r){mid = (r - l) / 2 + l;if(check(mid))l = mid;else r = mid;}return l;}int main(){while(scanf("%d%d", &n ,&c) != EOF){for(int i = 1; i <= n; i++){scanf("%d", &a[i]);}sort(a + 1, a + n + 1);//二分搜索之前先排序 cout<<binarySearch()<<endl;}return 0;} 

0 0
原创粉丝点击