有一類常見問題叫做最小值最大化或者最大值最小化。這類問題一般是用二分搜尋來解決。
首先二分搜尋解決的問題必須具備單調性這個性質,這是使用二分搜尋的必要條件,我們分析兩個問題。
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最小值最大化...