POJ 2456 Aggressive cows
来源:互联网 发布:软件视频会议系统 编辑:程序博客网 时间:2024/05/18 00:13
题意:john有n间牛舍,给出每个牛舍的位置。有M头牛需要安排在这些牛舍里。john希望让每头牛之间的距离尽可能大,防止他们打架。求出最大的距离。
思路:定义: C(d) = 可以安排牛的位置使最近的两头牛的距离不小于d。那问题就变成了满足C(d)的最大的d。
我们可以通过二分法去求距离,再判断这个距离是否可行。如果可行,增加距离。如果不行,减少距离
对上述定义进行变形:C(d) = 可以安排牛的位置使任意的牛的间距不小于d.。这个问题的判断就能用贪心法解决。
代码如下:
#include <cstdio>#include <algorithm>using namespace std;template <class T>inline bool read(T &n){ T signal = 1,x = 0; char ch = getchar(); while((ch < '0' || ch >'9') && ch != EOF && ch != '-') ch = getchar(); if(ch == EOF) return false; if(ch == '-') signal = -1,ch = getchar(); while(ch >= '0' && ch <= '9'){ x *= 10; x += ch -'0'; ch = getchar(); } n = signal * x; return true;}const int MAX = 100010;const int INF = 0x3f3f3f3f;int N,C;int x[MAX];bool judge(int d){ int now = 0; int next = 1; for(int i = 1; i < C; ++i){ next = now + 1; while(next < N && x[next] < x[now] + d) next++; if(next == N) return false; now = next; } return true;}int main(void){ read(N),read(C); for(int i = 0 ; i < N ; ++i) read(x[i]); sort(x,x+N); int ub = INF, lb = 0; while(lb + 1 < ub){ int mid = (lb + ub) / 2; if(judge(mid)) lb = mid; else ub = mid; } printf("%d\n",lb); return 0;}
0 0
- Poj 2456 Aggressive cows
- POJ 2456 Aggressive cows
- poj 2456 Aggressive cows
- poj 2456 Aggressive cows
- POJ-2456-Aggressive cows
- POJ 2456 Aggressive cows
- POJ-2456 Aggressive cows
- poj 2456 Aggressive cows
- POJ 2456 Aggressive cows
- POJ 2456 Aggressive cows
- poj 2456 Aggressive cows
- POJ 2456 Aggressive cows
- POJ 2456 Aggressive cows
- POJ-2456 Aggressive cows
- POJ-2456Aggressive cows
- POJ 2456 - Aggressive cows
- POJ 2456 Aggressive cows
- poj 2456 Aggressive cows
- c#文件操作的学习
- poj2115
- 韩语学习之第二课
- 误删数据文件后,Outlook无法启动的处理办法
- hdu-1162-Eddy's picture
- POJ 2456 Aggressive cows
- 关于定位、浮动、z-index 和 offsetParent 的一些概念
- C语言中重复定义的问题
- 一款集阅读、听书以及搜书于一体的多功能阅读器
- JSP表单提交给Servlet处理后,转到重定向的页面时,布局混乱
- Android-Spinner的Listenner事件及菜单级联
- GCDAsyncSocket接收数据连包无法解析的问题
- NSFileManager和NSFileHandle
- cocos2d-x 3.0 回调事件