POJ 2456 Aggressive cows 和 NYOJ 586 瘋牛【二分枚舉+貪心】

原題連接:http://poj.org/problem?id=2456               http://acm.nyist.net/JudgeOnline/problem.php?pid=586  

題意:直接看nyoj 的漢化版,我們簡化一下,其實就是 給一條直線上的n個點,讓你隨意選取c個點,然後使得這c個點兩兩之間的最小距離,如何選取這c個點使這個最小距離最大,輸出最大的最小距離max。

思路:我開始毫不看數據範圍的去寫了個深搜的代碼,結果你懂得……TLE!!搜了寫大牛的結題報告,發現這個題 最好的方法是 二分+貪心,用二分枚舉所有可能的max可能的取值複雜度long(n)。再用貪心判斷是否可行復雜度L,總複雜度就是 Llong(n);

AC代碼:

 

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<time.h>
#include<stdlib.h>
using namespace std;
int P[200000];
int n,m;
bool greed(int k)
{
    int i,max=P[0],sum=0;
    for(i=1;i<n;i++)
    {
        if(P[i]-max>=k)
        {
            sum++;
            max=P[i];
        }
        if(sum>=m-1)
          {return true;}
    }
    return false;
}
void two_find()
{
    int x=0,y=P[n-1]-P[0],mid;
    while(x<=y)
    {
        mid=(x+y)/2;
        if(greed(mid))
           x=mid+1;
        else
           y=mid-1;
    }
    printf("%d\n",x-1);
}
int main()
{
    //freopen("g:\\1.txt","r",stdin);
    //freopen("g:\\2.txt","w",stdout);
    int i,j;
    while(~scanf("%d%d",&n,&m))
    {
        for(i=0;i<n;i++)
            scanf("%d",&P[i]);
        sort(P,P+n);
        two_find();//二分枚舉最大距離
    }
}
        


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