POJ 2456 二分 貪心

2021-09-22 12:59:17 字數 1109 閱讀 4247

poj - 2456的題目鏈結

emm…開始讀了有點沒讀懂,實際上大概就是告訴你,給你n個牛棚,每乙個牛棚都有它的編號,再給你c頭牛,你現在就要把這c頭牛全部丟到牛棚裡面,求出最小的兩頭有牛的牛棚編號差值中的最大的那個。。。這個有點繞,大概就是,把c頭牛丟到n個牛棚裡面,有很多種丟法,但每次,兩兩有牛的牛棚編號之間的差值肯定會有乙個最小值,我們要求的是這麼多種丟法中的最小值集合中的最大的那個。

參考了這位大佬的思路和**

大佬分析的非常不錯,博主再分析一波。簡單來講,我們現在有n個牛棚,但可惜的是。這n個牛棚編號是無序的。so,我們可以先準備乙個陣列儲存著所有的牛棚編號,再呼叫標頭檔案中的sort函式(非常nice的乙個庫函式,就不用寫快排了,預設是從小到大排序)。將這n個牛棚編號按從小到大的順序排列好,這樣,兩個牛棚編號差值的最大值,最大不過陣列兩個端點的差值了。(因為已經從小到大排序好了),最小呢,即是0(牛棚編號可能相同)。然後,我們需要運用二分的方法,(因為n太大的話,暴力是肯定會wa的)。找到每此臨時區間中的中點(通過二分列舉最小值來求。假設當前的最小值為x,如果判斷出最小差值為x時可以放下c頭牛,就先讓x變大再判斷;如果放不下,說明當前的x太大了,就先讓x變小然後再進行判斷。直到求出乙個最大的x就是最終的答案),再結合判斷函式 找個那個最大的,符合條件的(能把所有的牛都能放完)牛棚編號差值,即為結果。

#include #include #include #include #include #include #include using namespace std;

const int n = 100005;

int a[n], n, c;

bool panduan(int x) //判斷此時的x能否能將c頭牛全部放完

}return false;

}int erfen() //找到最大的最小距離

return l-1; //根據之前的if條件。此時l-1才等於最大的mid

}int main()

sort(a,a+n); //快排

printf("%d\n",erfen());

}return 0;

}

poj2456(二分搜尋)

題意 n間牛舍,m頭牛,最近的兩頭牛的距離為d,求d的最大值 key 二分搜尋。從0 無窮大中搜尋符合要求的值。二分搜尋 include include include include using namespace std const int maxn 1e5 int n,m int inf 1e...

POJ2456 二分搜尋

poj2456 aggressive cows 題意 有n間牛舍,牛舍被排在一條線上,第i號牛舍在xi的位置。但是他的m頭牛對小屋很不滿意,因此經產互相攻擊。為了防止牛之間互相傷害,因此決定把每頭牛都放在離其他牛盡量遠的牛舍。也就是要最大化最近的兩頭牛之間的距離。關於最小值最大化或者最大值最小化的問...

POJ 2456 二分答案

在n個點中選c個點使得相鄰的點之間的最小距離最大,求最大值。求二分區間中滿足條件的最大值。二分區間為 0,陣列中最大差距 如果mid滿足題意那麼比mid小的答案也滿足題意。include include using namespace std const int maxn 1e5 10 int a ...