/**
你有b元錢,想要組裝一台電腦。給出n個配件的種類、品質因子,和**,
每種型別的配件各買乙個,總價不超過b,求配件最小品質因子的最大值。
sample input
118 800
processor 3500_mhz 66 5
processor 4200_mhz 103 7
processor 5000_mhz 156 9
processor 6000_mhz 219 12
memory 1_gb 35 3
memory 2_gb 88 6
memory 4_gb 170 12
mainbord all_onboard 52 10
harddisk 250_gb 54 10
harddisk 500_fb 99 12
casing midi 36 10
monitor 17_inch 157 5
monitor 19_inch 175 7
monitor 20_inch 210 9
monitor 22_inch 293 12
mouse cordless_optical 18 12
mouse microsoft 30 9
keyboard office 4 10
sample output
9找最大值,二分,假設答案為x
排除品質因子小於x的所有配件,如果能組裝出一台電腦,則ans >= x else ans < x;*/
#include #include #include #include #include using namespace std;
struct aa
};mapid;
vector c[1010];
int cnt = 0;
int n, b;
int id(string s) //將map裡面的對應關係提取出來
bool check(int q)
if(mi == b + 1) return 0;
sum += mi;
if(sum > b) return 0;
}return 1;
}int main()
int l = 0, r = maxn;
while(l < r)
cout << l << endl;}}
return 0;
}
關於二分的一點總結:
浮點數轉換當然是l = mid 或 r = mid,結束條件是 r - l < esp;
整數的時候mid 有兩種取法:左中 (l + r) / 2,右中 (l + r + 1) / 2,c++stl中的
例如: l = 2,r = 3; mid 採用上面兩種分別可以取到2,3;
如果轉換是 l = mid + 1,r = mid-1;那上述兩種方式都可以
如果轉換是 l = mid; r = mid - 1;
例如我們要求滿足不等式 x^3 + 100x <= 1e+6 的最大整數x
如果mid滿足那個不等式,那麼mid就有可能是答案,所以我們只能將mid送入l,而不是mid + 1;
此時,如果採用左中取mid ,l = 2,r = 3;而3確實答案,mid將一直取到2,且一直送2給 l,l 與 r 不是同乙個數,就不會出迴圈,也就是程式進入了死迴圈,所以這時只能採用右中方式取mid = (l+r+1)/2;
同理若求滿足不等式x^3 + 100x >= 1e+6 的最小整數x,則轉換是 l = mid + 1; r = mid 的時候只能採用左中方式取mid= (l+r)/2;
forwarditerlower_bound(forwarditer first, forwarditer last,const _tp& val)演算法返回乙個非遞減序列[first, last)中的第乙個大於等於值val的位置。
forwarditerupper_bound(forwarditer first, forwarditer last, const _tp& val)演算法返回乙個非遞減序列[first, last)中第乙個大於val的位置.
這兩個函式都是對應大於的,採用mid = (l+r)
/2的方式,若是小於則要mid = (l + r + 1) / 2;
LA 3971 組裝電腦
傳送門 大意是給一些零件 屬性 種類,名稱 沒用 加格,品質 電腦的品質取決於最低的配件品質,問有的錢能買的最高的電腦品質。這個題一看就是二分,o n 2 logn t 的演算法也很好想,就是排序之後二分下標,貪心可check。字串的話,我使用的是類似離散的方法編號而避免了用map,因為map st...
uvalive3971(二分 貪心)
題目的意思是 你要去買一台電腦,然後有很多種零件,你每種零件買乙個 零件給出的的資訊有種類,名字,質量.你組裝的電腦的質量,取決於你的零件中質量最差的,也就是你要讓最差值盡量大,但是 不能超出你的budget,也就是你有的錢.把零件按質量從大到小排,然後從大到小判斷這個質量能不能作為最小值.知道找到...
LA3971 組裝電腦 二分答案
演算法競賽入門經典 訓練指南 第28頁,例題12 注意二分的時候m l r 1 2,二分法為了避免死迴圈,根據情況m l r 2 m l r 1 2 題解對輸入的多個字串編號採用了map 的寫法以後可以借鑑下 題解就是假設最小的品質因子是x,則刪除所有品質因子小於x的配件,然後判斷剩下配件能否組裝出...