找出最大的质量。利用二分查找,找每一个配件高于中间质量的价格最低的型号。
#include<cstdio>
#include<vector>
#include<map>
#include<iostream>
using namespace std;
const int maxn = 1000 + 5;
struct components
{
int price;
int quality;
};
int cnt, n, tot;
map<string, int> ID;
int get_id(string s)
{
if(!ID.count(s))
ID[s] = cnt++;
return ID[s];
}
vector<components> things[maxn];
bool ok(int p)
{
int sum = 0;
for(int i = 0; i < cnt; i++)
{
int cheapest = tot + 1;
for(int j = 0; j < things[i].size(); j++)
{
if(things[i][j].quality >= p)
cheapest = min(cheapest, things[i][j].price);
}
if(cheapest == tot + 1) return false;
sum = sum + cheapest;
if(sum > tot) return false;
}
return true;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
cnt = 0;
scanf("%d%d", &n, &tot);
for(int i = 0; i < n; i++)
things[i].clear();
ID.clear();
int mq;
for(int i = 0; i < n; i++)
{
string type, name;
int price, quality;
cin>>type>>name>>price>>quality;
mq = max(mq, quality);
int id = get_id(type);
things[id].push_back((components){price, quality});
}
int L = 0, R = mq;
//printf("%d\n", cnt);
while(L < R)
{
//printf("%d %d\n", L, R);
int mid = L + (R - L + 1) / 2;
if(ok(mid)) L = mid;
else R = mid - 1;
}
printf("%d\n", L);
}
return 0;
}