題目:
給定電腦的n(n<1000)個配件,每個配件有型別,名字(沒用的資訊),**和品質因子。要求每種型別的配件各買乙個用於組裝電腦,總**不超過b元。求所有可能的方案中品質因子最差的那個配件的品質因子最大能是多少。
分析:
看著這資料,覺得暴力也可做,列舉每個品質因子,找出滿足要求的最大的。但如果資料大一點,就不能這麼暴力了,就要二分答案去找最優解了。
具體實現,就是把每種型別的配件都儲存到乙個vector中,買的時候從這裡面選擇乙個品質因子比最小的要大的品質因子且**最低的配件,然後把所有的加起來,判斷一下是不是<=b就好。
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef pairpii;
#define pb push_back
#define mpi make_pair
mapmp; //每中型別對應乙個儲存這種型別配件的vector
vector
vec[1001]; //儲存每種型別的配件
int b,n,cnt;
bool check(int q)
if(sum<=b)return
1; return0;}
int main()
else
if(!ma.count(q))a.pb(q),ma[q]=1;
}for(int i=0;iint l=0,r=a.size()-1;
sort(a.begin(),a.end());
while(lint m=(l+r)>>1;
if(check(a[m]))l=m+1;
else r=m-1;
}if(l//因為二分,不確定是不是l是最優解,有可能l不是。所以再判斷一下
printf("%d\n",a[l]);
else
if(check(a[l-1]))
printf("%d\n",a[l-1]);
}return
0;}
LA3971 組裝電腦 二分答案
演算法競賽入門經典 訓練指南 第28頁,例題12 注意二分的時候m l r 1 2,二分法為了避免死迴圈,根據情況m l r 2 m l r 1 2 題解對輸入的多個字串編號採用了map 的寫法以後可以借鑑下 題解就是假設最小的品質因子是x,則刪除所有品質因子小於x的配件,然後判斷剩下配件能否組裝出...
Assemble 組裝電腦,LA 3971
你有b塊錢,想要組裝一台電腦。給出n個配件各自的種類 品質因子和 要求每種型別的配件各買乙個,總 不超過b,且品質最差的配件的品質因子應盡量大。1.考慮暴力解法 將n個配件分成m類,每一類選乙個品質因子不小於q的 最低的配件。如果總 不超過b,則品質因子q滿足條件。而要使品質因子盡量大,則從小到大列...
LA 3971 組裝電腦
傳送門 大意是給一些零件 屬性 種類,名稱 沒用 加格,品質 電腦的品質取決於最低的配件品質,問有的錢能買的最高的電腦品質。這個題一看就是二分,o n 2 logn t 的演算法也很好想,就是排序之後二分下標,貪心可check。字串的話,我使用的是類似離散的方法編號而避免了用map,因為map st...