题意:
你需要组装电脑,一共有n个配件,b的预算,n个配件中包含了各类电脑配件的价格和品质。组成一台计算机的配件的品质可能不同,但其性能取决于品质最差的那个配件。问在预算内可以使得电脑达到的最大性能是多少。
思路:
大致思路是在0~最大品质之间二分,看某个品质当前预算是否能够满足品质为q的电脑,每次选取零件的时候我们总是选择满足条件中的最便宜的零件。如此二分下去,最终就能得到答案。此题因为我们需要把零件存入不同的数组中,因此在输入的时候需要把配件的名称转化为下标,我们可以使用一个 map 来实现这个功能。
代码:
#include <bits/stdc++.h>
#define N 1005
#define fp(PP,QQ,RR) for(int PP = QQ;PP < RR;PP++)
using namespace std;
int n,b,ro,k,mq;
struct com{
int p,q;
};
map <string,int> mp;
int id(string s){
return mp.count(s) ? mp[s] : (mp[s] = k ++);
}
vector <com> coms[N];
bool ok(int q){
int sum = 0;
for(int i = 0;i < k;i ++){
int chepest = b + 1;
fp(j,0,coms[i].size()){
if(coms[i][j].q >= q && coms[i][j].p < chepest){
chepest = coms[i][j].p;
}
}
if(chepest == b + 1 || sum + chepest > b) return 0;
sum += chepest;
}
return 1;
}
int main(void)
{
cin >> ro;
while(ro --){
mp.clear();
mq = k = 0;
cin >> n >> b;
fp(i,0,n){
coms[i].clear();
string name,t;int p,q;
cin >> name >> t >> p >> q;
mq = max(q,mq);
coms[id(name)].push_back((com){p,q});
}
int l = 0,r = mq,m;
while(l < r){
m = l + (r - l + 1) / 2;
if(ok(m)) l = m;
else r = m - 1;
}
cout << l << endl;
}
return 0;
}