Aggressive cows
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 6948 | Accepted: 3462 |
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?
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
* 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 3 1 2 8 4 9
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.
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.
題目大意:
給你x軸上的n個座標,然後告訴你一個整數m,使得兩個距離最近的點的距離最大(是不是有點暈,就是說比如1,2,4,8,9這5個點,當m==3的時候,在1,4,9各放一個牛,則最近的兩個點是4,9那麼他們之間的距離是5,是最大的了)
解題思路:
其實就是一道二分,定義好方程的狀態然後在[0,inf]的區間內去尋找滿足條件的解就OK了
定義C(d)表示的是可以安排牛的位置使得最近的兩頭內的距離不小於d、其實也就是說,使得任意兩頭牛的距離不小於d了。
然後我們利用貪心的方法就可以解決了。
1,現對於牛棚的座標進行排序。
2,把第一頭牛放在x[0]的位置。
3,如果第i頭牛放入了第x[j]的位置,那麼第i+1頭牛就應該滿足x[k]-x[j]>=d的最小的k中。。。。
代碼:
# include<cstdio>
# include<iostream>
# include<algorithm>
# include<cstring>
# include<string>
# include<cmath>
# include<queue>
# include<stack>
# include<set>
# include<map>
using namespace std;
# define inf 999999999
# define MAX 100000+4
int a[MAX];
int n,m;
bool C ( int d )
{
int last = 0;
for ( int i = 1;i < m;i++ )
{
int crt = last + 1;
while ( crt < n&& a[crt] - a[last] < d )
{
crt++;
}
if ( crt == n )
return false;
last = crt;
}
return true;
}
int main(void)
{
while ( cin>>n>>m )
{
for ( int i = 0;i < n;i++ )
{
cin>>a[i];
}
sort(a,a+n);
int lb = 0,ub = inf;
while ( ub-lb > 1 )
{
int mid = ( lb+ub )>>1;
if ( C(mid) )
lb = mid;
else
ub = mid;
}
printf("%d\n",lb);
}
return 0;
}