题意:
给你一定数量的钱要求在付得起的方位内所买的配件中质量最差的那个的质量尽量大
思路:
最小值最大问题
用二分法不断尽量大的去匹配,用到了vector使ID与质量对应,因为ID是唯一的
代码:
#include<bits/stdc++.h>
using namespace std;
int cnt, money, num;
map<string, int> id;
struct component {
int price;
int qua;
};
vector<component> comp[1005];
int ID(string a) {
if(!id.count(a)) id[a]=cnt++;
return id[a];
}
bool ok(int m) {
int sum = 0;
for(int i=0; i<cnt; i++) {
int c=money+1;
for(int j=0; j<comp[i].size(); j++) {
if(comp[i][j].qua >= m) c = min(c, comp[i][j].price);
}
if(c == money+1) return false;
sum += c;
if(sum > money) return false;
}
return true;
}
int main() {
int kase;
scanf("%d", &kase);
while(kase--) {
scanf("%d%d", &num, &money);
char type[30], name[30];
int p, q;
cnt = 0;
for(int i=0; i<num; i++) comp[i].clear();
id.clear();
int maxq = 0;
for(int i=0; i<num; i++) {
scanf("%s%s%d%d", type, name, &p, &q);
maxq = max(maxq, q);
comp[ID(type)].push_back((component){p, q});
}
int l=0, r=maxq;
while(l < r) {//又一种二分形式,形式是一定的
int m=(l+r+1)/2;
if(ok(m)) l=m;
else r=m-1;
}
printf("%d\n", l);
}
return 0;
}