求最小值中的最大值,二分答案找出。
//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/9/29.
// Mail:1016427040@qq.com or jasonshaosjj@gmail.com
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
const int maxn=1000+10;
map<string,int> id;
int cnt;
int ID(string s)
{
if(!id.count(s)) id[s]=cnt++;
return id[s];
}
struct node{
int p,q;
};
vector<node> comp[maxn];
int n,b;
bool ok(int m)
{
int sum=0;
for(int i=0;i<cnt;i++)
{
int cheapest=b+1;
for(int j=0;j<comp[i].size();j++)
if(comp[i][j].q>=m) cheapest=min(cheapest,comp[i][j].p);
if(cheapest==b+1) return false;
sum+=cheapest;
if(sum>b) return false;
}
return true;
}
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();
int maxq=0;
char s1[maxn],s2[maxn];
int p,q;
for(int i=0;i<n;i++){
scanf("%s%s%d%d",s1,s2,&p,&q);
maxq=max(maxq,q);
comp[ID(s1)].push_back((node){p,q});
}
int l=0,r=maxq;
int mid;
while(l<r){
mid=l+(r-l+1)/2;
if(ok(mid)) l=mid;
else r=mid-1;
}
printf("%d\n",l);
}
return 0;
}