POJ 2456 Aggressive cows(貪心+二分)

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?

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 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.

題目大意:

給你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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章