POJ - 2456 Aggressive cows(二分查找)

来源:互联网 发布:linux grep命令与管道 编辑:程序博客网 时间:2024/05/20 03:45
Aggressive cows
Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u

Submit Status

Description

Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,...,xN (0 <= xi <= 1,000,000,000). 

His C (2 <= C <= N) cows don't like this barn layout and become aggressive towards each other once put into a stall. To prevent the cows from hurting each other, FJ want to assign the cows to the stalls, such that the minimum distance between any two of them is as large as possible. What is the largest minimum distance?

Input

* Line 1: Two space-separated integers: N and C 

* Lines 2..N+1: Line i+1 contains an integer stall location, xi

Output

* Line 1: One integer: the largest minimum distance

Sample Input

5 312849

Sample Output

3

Hint

OUTPUT DETAILS: 

FJ can put his 3 cows in the stalls at positions 1, 4 and 8, resulting in a minimum distance of 3. 

Huge input data,scanf is recommended.

 

 题意:有N间牛舍,排在一条线上,第i号牛舍在xi的位置。有M头牛,希望将每头牛放在离其他牛尽量远的位置。求最大化最近两头牛的距离。

思路:二分搜索求解,判断条件是可以安排使得任意牛的距离不小于d。只要扫一遍n个牛舍就可以得到答案,O(n)的判断。

 

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int MAXN = 100000 + 1000;int x[MAXN];int n, c;bool countNiu(int d){int npos = x[0];int cnt = 1;for (int i = 1; i < n; i++){if (x[i]>=npos + d){cnt++;npos = x[i];}}if (cnt >= c) return true;return false;}int main(){while (scanf("%d%d", &n, &c) != EOF){for (int i = 0; i < n; i++)scanf("%d", &x[i]);sort(x, x + n);int l = 0; int r = x[n-1]-x[0], m;while (r - l > 1){m = (l + r) / 2;if (countNiu(m)) l = m;else r = m;}printf("%d\n", l);}}


 

0 0
原创粉丝点击