二分搜尋 (最小值最大化和最大值最小化)

2021-09-25 14:17:00 字數 1903 閱讀 8885

有一類常見問題叫做最小值最大化或者最大值最小化。這類問題一般是用二分搜尋來解決。

首先二分搜尋解決的問題必須具備單調性這個性質,這是使用二分搜尋的必要條件,我們分析兩個問題。

1.最小值最大化:我們假設x為最大的最小值,那麼x-1是滿足條件的,但他並不滿足最大,x+1是不滿足條件的,假設我們左邊界是l,右邊界是r,我們二分乙個答案ans,ans為最後乙個滿足條件的數,我們是不是可以模擬二分搜尋(一)中的last_less_equal()或者last_less()這個問題和這兩者是差不多的。可以先閱讀我的另一篇博文:二分搜尋(一)——各種二分

2.最大值最小化:我們假設x為最小的最大值,那麼x-1是不滿足條件的,x+1是滿足條件的,但他不滿足最小,假設我們左邊界是l,右邊界是r,我們二分乙個答案ans,ans為第乙個滿足條件的數,我們是不是可以模擬二分搜尋(一)中的lower_bound()或者upper_bound()這個問題和這兩者是差不多的。

最小值最大化的二分區間是右閉左開(l,r],每次二分的中心為m=(l+r+1)/2;最大值最小化的二分區間是左閉右開,[l,r),每次二分的中心為m=(l+r)/2。

題目意思:你有b塊錢,想要組裝一台電腦。給出n個配件格仔的種類,品質因子和**,要求每種型別的配件各買乙個,總**不超過b,且品質最差的配件的品質因子盡量大。

思路:這很明顯是乙個最小值最大化的問題,這道題還用到map對物品按名稱進行分類,注意多組輸入,要對上一組的資料進行清空,我們可以看出二分邊界l=-1,r=maxq(所有商品中品質因子的最大值。),也就是右閉左開區間(l,r],我們搜尋最後乙個滿足條件的ans值,具體看**吧。

**:

#includeusing namespace std;

const int n=1000+7;

mapmp;

struct node;

vectora[n];

int cnt=0,n,b;

int check(int m)

}sum+=minn;

if(sum>b) return 0;

}return 1;

}int main()

r=max(r,q);

a[mp[type]].push_back();

}while(l題目意思:農民約翰有用c隻牛,然後他有n個隔間,每個隔間都有自己的座標位置(一維的)pos,如何安排把牛安排進隔間才能使,所有牛之間距離的最小值最大,我們不需要求這個分配方案,我們只需要求這個最小距離的最大值,很裸的最小值最大化。

思路:直接看**吧

**:#includeusing namespace std;

typedef long long ll;

const int n=1e5+7;

ll n,c,a[n];

int check(int m)

if(t==0) break;

}return t==0;

}int main()

sort(a,a+n);

int l=0,r=maxx-minn;

while(l題目意思:共n個月,給出每個月的開銷.將n個月劃分成m個時間段,求m個時間段中開銷最大的時間段的最小開銷值。

思路:最大值最小化,直接看**吧

**:#includeusing namespace std;

int n,m;

vectora;

int check(int m)

now+=a[i];

}return ct>n>>m;

a.resize(n);

int r=0,l=0;

for(int i=0;i>a[i];

r+=a[i];

l=max(l,a[i]);

}r++;

while(lcout

}

二分 最小值最大化

問題描述 記得上學那會,fbs同學經常會欺負蘿蔔同學。有一次,他出了這麼一道題目,想為難一下蘿蔔同學。題目是這樣的 有n個整數x i,x i值的範圍從0到1000000000。要從中選出c個數 2 c n 使得任意兩個數差的絕對值的最小值盡可能大,求這個最大值。由於資料太大,這次蘿蔔同學的確被難住了...

最大化最小值 二分

aggressive cows 題目意思 農民約翰有用c隻牛,然後他有n個隔間,每個隔間都有自己的座標位置 一維的 pos,如何安排把牛安排進隔間才能使,所有牛之間距離的最小值最大,我們不需要求這個分配方案,我們只需要求這個最小距離的最大值,很裸的最小值最大化。輸入 n 5m 3x 輸出 3 在位置...

二分搜尋的最大值最小化與最小值最大化

求最大值最小化 二分區間 l,r l max l,r 的區間根據題目所定,這邊寫的區間都是下面題目的區間 r sum 二分模板 while l求最小值最大化 二分區間 l,r l 0 l,r 的區間根據題目所定,這邊寫的區間都是下面題目的區間 r a n a 1 二分模板 while l最小值最大化...