题意:你要组成一台电脑,电脑由多个组成,每个组件有多个可供选择,每个组件有两个值p,q,代表价格和质量,给定代表你的钱,要求你买的组件不超过b的情况下组成一个电脑并且q最大(备注:电脑的q值等于所有组件的q值的最小值),问q为多少? 这种就是最小值最大化。(最小是一种限制,在这种限制下看能尽量更大的值)
思路:发现q满足单调性,二分,用map和vector辅助求解!
代码:
#include<cstdio>
#include<vector>
#include<iostream>
#include<iostream>
#include<map>
using namespace std;
#define inf 1000000000
struct Node{
int p,q;
};
map<string,int>M;
vector<Node>save[1005];
int cnt;
int IsAppear(string type){
if(M.count(type)==0) return M[type]=cnt++;
else return M[type];
}
bool check(int q, int b){
int sum = 0;
for(int i = 0; i<cnt; i++){
int minPri = b + 1;
for(int j = 0; j<save[i].size(); j++){
if(save[i][j].p < minPri && save[i][j].q >= q) minPri = save[i][j].p;
}
sum += minPri;
if(minPri == b+1) return false;
if(sum > b) return false;
}
return true;
}
int main()
{
int t,n,b;
cin>>t;
while(t--){
cin>>n>>b;
//initial()
cnt = 0;
M.clear();
for(int i = 0; i<1005; i++) save[i].clear();
char type[30],name[30];
int pri,qua;
for(int i = 1; i<=n; i++){
cin>>type>>name>>pri>>qua;
int id = IsAppear(type);
save[id].push_back((Node){pri,qua});
}
int left = 0, right = inf;
while(left<right){
int mid = (left+right+1)/2;
if(check(mid, b)) left = mid;
else right = mid-1;
}
printf("%d\n",left);
}
return 0;
}