NYOJ 586 疯牛(最大化最小值)
2016-05-21 12:30
309 查看
疯牛
时间限制:1000 ms | 内存限制:65535 KB描述农夫 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
可以安排任意两头牛的位置都不小于d,可以用二分法来搜索目标d。
首先要对牛舎的位置进行排序,第一头牛舍是必须要用到的,接下来找第二头牛舍,则两个牛舎的距离要大于等 于d,后面的牛舎也是如此。
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #define INF 0x3f3f3f3f #define MAX 100005 using namespace std; int n,m,a[MAX]; bool C(int d) { int last = 0,j = 1,i; for(i = 1; i<m; i++) { int crt = last + 1;//crt代表当前牛舎 while(crt<n&&a[crt]-a[last]<d)//寻找当前免租条件的牛舎crt crt++; if(crt == n) return false;//若找不到满足的,结束 last = crt;//把当前满足条件的牛棚作为基点,去寻找下一个 } return true; } void solve() { sort(a,a+n); int x = 0,y = INF; while(y-x>1) { int mid = (x+y)/2; if(C(mid)) x = mid;//解的范围【x,y) else y = mid; } printf("%d\n",x); } int main() { while(~scanf("%d%d",&n,&m)) { for(int i = 0; i<n; i++) scanf("%d",&a[i]); solve(); } return 0; }
相关文章推荐
- 悦海购O2O跨境电商
- 使用RegularExpressions去除HTML标签的字符串
- Python之路—Day2作业
- TLint for 虎扑体育 基于Dagger2+RxJava+Retrofit开发,采用MVP模式
- C# 委托的三种调用示例(同步调用 异步调用 异步回调)
- Surfaceflinger代码位置
- 数学类笔试题
- 不同系统的换行符号
- 自定义View之继承TextView绘制背景
- Android中解析XML
- 三种方法解决跨域问题
- 编程技巧 - elegant - 3
- 近期健康类(***)
- Debian安装gSTC-ISP
- centos 7 安装配置mysql
- FileStram文件正由另一进程使用,该进程无法访问该文件,解决方法
- 练习014-015
- Hive原理及查询优化
- 第十三周项目 动物这样叫2.2
- 动态规划8之1013