演算法競賽入門經典(訓練指南)第28頁,例題12
注意二分的時候m = (l+r+1)/2,二分法為了避免死迴圈,根據情況m=(l+r)/2 || m=(l+r+1)/2題解對輸入的多個字串編號採用了map<>的寫法以後可以借鑑下
題解就是假設最小的品質因子是x,則刪除所有品質因子小於x的配件,然後判斷剩下配件能否組裝出乙個總價小於b的電腦,能的話,說明答案ans>=x,否則ans至於判斷能否組裝出總價小於b的電腦,直接在每種配件中選擇**最便宜的即可。
#include #include #include #include #include #include #define maxn 1010
using namespace std;
int cnt; // 配件型別數
int n,b;
// 以後處理輸入的很多字串,需要對其雜湊承1-n的數字可以用此方法
mapm; // 配件型別及其對應的型別號
struct component ;
vectorcomp[maxn];
// 對輸入的字串雜湊成編號
int id(string s)
return m[s];
}// q代表選中配件的最小品質
bool isok(int q)
}// 該類配件缺少
if(temp == 0) return false;
totalprice += minprice;
if(totalprice > b) return false;
}return true;
}int main() );
}int l = 0,r = maxq;
while(l < r) else
}printf("%d\n",l);
}return 0;
}
組裝電腦 LA 3971 二分答案
題目 給定電腦的n n 1000 個配件,每個配件有型別,名字 沒用的資訊 和品質因子。要求每種型別的配件各買乙個用於組裝電腦,總 不超過b元。求所有可能的方案中品質因子最差的那個配件的品質因子最大能是多少。分析 看著這資料,覺得暴力也可做,列舉每個品質因子,找出滿足要求的最大的。但如果資料大一點,...
LA 3971 組裝電腦
傳送門 大意是給一些零件 屬性 種類,名稱 沒用 加格,品質 電腦的品質取決於最低的配件品質,問有的錢能買的最高的電腦品質。這個題一看就是二分,o n 2 logn t 的演算法也很好想,就是排序之後二分下標,貪心可check。字串的話,我使用的是類似離散的方法編號而避免了用map,因為map st...
Assemble 組裝電腦,LA 3971
你有b塊錢,想要組裝一台電腦。給出n個配件各自的種類 品質因子和 要求每種型別的配件各買乙個,總 不超過b,且品質最差的配件的品質因子應盡量大。1.考慮暴力解法 將n個配件分成m類,每一類選乙個品質因子不小於q的 最低的配件。如果總 不超過b,則品質因子q滿足條件。而要使品質因子盡量大,則從小到大列...