题目大意:有N个组件,每个组件都有相应的type,name,price,quality,给你B钱,要求你每种type都要选择一样,在价格不超过B的情况下,使quality的最小值达到最大
解题思路:最小值最大化的情况,就一一枚举,用二分法进行枚举,枚举出来的结果一定是其中一种type的最小
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<string>
#define maxn 1010
using namespace std;
struct Computer{
int price;
int quality;
};
vector<Computer> C[maxn];
map<string,int> M;
int N, B, num;
int change(string s) {
if(!M.count(s))
M[s] = num++;
return M[s];
}
bool judge(int q) {
int sum = B, size, MIN;
for(int i = 0; i < num; i++) {
size = C[i].size();
MIN = B + 1;
for(int j = 0; j < size; j++)
if(C[i][j].quality >= q)
MIN = min(MIN,C[i][j].price);
sum -= MIN;
if(sum < 0)
return false;
}
return true;
}
int main() {
int test;
scanf("%d",&test);
while(test--) {
scanf("%d%d",&N, &B);
int MAX_quality = -1, p, q;
char t1[30], t2[30];
num = 0; M.clear();
for(int i = 0; i < N; i++)
C[i].clear();
for(int i = 0; i < N; i++){
scanf("%s%s%d%d",t1, t2, &p, &q);
MAX_quality = max(MAX_quality, q);
C[change(t1)].push_back((Computer){p,q});
}
int L = 0, R = MAX_quality, mid;
while(L < R) {
mid = (L + R + 1) / 2;
if(judge(mid))
L = mid;
else
R = mid - 1;
}
printf("%d\n",L);
}
return 0;
}