ybtoj 二分演算法 最小時間

2022-09-21 22:42:19 字數 1001 閱讀 6246

有n個物品,第i個物品有兩個屬性k,b,表示它在時刻 的價值為k*x+b。

當前處於時刻0,你可以選擇不超過m個物品,使得存在非負整數時刻t,你選擇的所有物品的總價值大於等於s。

給出s,求t的最小值。

第一行三個整數n,m,s。

接下來n行,第i行兩個整數k,b。

一行乙個整數表示答案。

3 2 100

3 9-2 50

4 1

選擇1,3號物品。

3 2 100

-1 49

-2 50

1 -998244353

選擇3號物品。

選擇任何乙個集合,得到的收益和都可以表示為乙個一次函式的形式.我們只關心這些一次函式的最大值,可以發現這個最大值一定是先降後公升的(也有可能是單調遞增或單調遞減).

因此我們只需要check一下0時刻是否符合條件,如果不符合則進行二分.

注意check的時候我們只需要找出最大的m個即可,因此可以o(n)地做.具體做法是快排的時候只遞迴一邊,當然你不需要手寫,直接用stl的nth_element()即可

#includeusing namespace std;

long long k[1000086],b[1000086],h[1000086];

bool cmp(long long x,long long y)

long long l=0,r=1e9;

long long mid;

long long sum=0;

long long ans=0;

int main()

while(l=s)

} l=mid+1;

next: ;

} cout《所謂的nth_element()作用就是是給定位置的值成為這個位置該有的值.

以後我會單獨出一篇專門介紹nth_element文章

供各位學習與交流

分治演算法 二分求最大最小

例題1 給n個實數,求它們之中最大值和最小值,要求比較次數盡量小。思路 用遞迴呼叫函式,在函式裡做出以下判斷 1 若left right 只有乙個數 max和min都為這個數 2 若left right 1 只有兩個數 max為較大的,min為較小的 3 除以上兩種以外 首先定義中間值d,在遞迴呼叫...

YbtOJ高效高階 二分 3 最大均值

ybtoj高效高階 二分 3 給定正整數序列a 求乙個平均數最大的,長度不小於 l 的 連續的 子段。10 66 4 21038 59 416500顯然二分 那要不然為啥是二分練習題呢 我們二分出這個平均值 然後把數列中每個數都減去這個平均值 然後找是否有一段長度不小於l的且和不為負數的數段即可 i...

YbtOj練習 二分5 飛離地球

除看這道題,以為就是很簡單的二分 判斷負環 但是數次0分告訴我哪有你想的那麼簡單 我們在求最短路的過程中,應該把那些不同時滿足1.與起點聯通2.與終點聯通的點刪除。一旦我們把這些點考慮進去,且這些點上還有負環時,對答案的影響就是致命的。比如說這種情況 而如果終點不滿足上述條件,我們就可以直接輸出 1...