
/**//*
Name: avcpp
Copyright: stl
Author:
Date: 10/02/11 20:32
Description: stl+二分
*/


#include <stdio.h>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
class node


{
public:
string name;
int price;
int quality;

node(string _name,int _price,int _quality):name(_name),price(_price),quality(_quality)
{}
};
int n,m;
map<string,vector<node> > data;
vector<int> q;
bool check(int lowest_quality)


{
long long int cost=0;
for(map<string,vector<node> >::iterator i=data.begin();i!=data.end();++i)

{
int buf=0xfffffff;
for(vector<node>::iterator j=(i->second).begin();j!=(i->second).end();++j)

{
if(j->quality>=lowest_quality&&j->price<buf)

{
buf=j->price;
}
}
cost+=buf;
}
return cost<=(long long) m;
}
int main()


{
int cas;
while(scanf("%d",&cas)!=EOF)

{
for(int xx=1;xx<=cas;xx++)

{
data.clear();
q.clear();
scanf("%d %d",&n,&m);
char name[128],buf[128];
int quality,price;
for(int i=0;i<n;i++)

{
scanf("%s %s %d %d",name,buf,&price,&quality);
q.push_back(quality);
data[string(name)].push_back(node(string(name),price,quality));
}
sort(q.begin(),q.end());
vector<int>::iterator end=unique(q.begin(),q.end());
while(q.end()!=end) q.pop_back();
int l,r;
l=0;
r=q.size()-1;
while(l<=r)

{
int mid=(l+r)>>1;
if(check(q[mid]))

{
l=mid+1;
}
else

{
r=mid-1;
}
}
printf("%d\n",q[l-1]);
}
}
return 0;
}

posted on 2011-02-10 22:35
avcpp 阅读(80)
评论(0) 编辑 收藏 引用