/***********************
* Author:fisty
* Data:2014-12-10
*二分法,最大化最小值
*uva12124
**********************/
#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
int cnt; //组件的类型数
map<string, int> id;
const int max_n = 1005;
int ID(string s){
if(!id.count(s)) id[s] = cnt++; //当名字为s的类型没出现过,cnt++
return id[s]; //返回名字
}
struct component{
int price; //价格
int quilty; //品质因子
};
int n, b; //总数目与预算
vector<component> comp[max_n];
bool ok(int q){
//品质因子大于等于q的零件并且可以组装成一台电脑,返回true
int sum = 0; //所有质量因子的总和
for(int i = 0; i < cnt; i++){
int cheapest = b + 1,m = comp[i].size();
for(int j = 0;j < m ;j ++){
//遍历种类为i的所有大于q的物品,选取价值最小的
if(comp[i][j].quilty >= q) cheapest = min(cheapest, comp[i][j].price);
}
if(cheapest == b+1) return false;
sum += cheapest;
if(sum > b) return false;
}
return true;
}
void solve(int max_q){
int l = 0, r = max_q;
while(l < r){
int m = l + (r-l+1) / 2;
if(ok(m)) l = m; //如果可以组装出一台预算不超过b的电脑,则提高质量因子.
else r = m-1;
}
printf("%d\n", l);
}
int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d%d", &n, &b);
cnt = 0;
//清零
for(int i = 0;i < n; i++)comp[i].clear();
id.clear();
//input
int max_q = 0;
for(int i = 0;i < n; i++){
string type, name;
int p, q; //价值与品质因子
cin >> type >> name >> p >> q;
max_q = max(max_q, q);
comp[ID(type)].push_back((component){p, q});
}
solve(max_q);
}
return 0;
}
uva12124 组装电脑

最新推荐文章于 2022-10-29 20:12:18 发布
