最小值 最大问题 一般用2分去解决了 难得的一道常规的题 然后我二分的时候 写的>>1 结果死循环了 没有注意到 +比>>运算级要高 (就是高一级 写成 a+b>>c+d 也是先运算2个+号 再左移)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
#include<set>
#define scnaf scanf
#define cahr char
#define bug puts("bugbugbug");
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
typedef long long ll;
const int mod=1000000007;
const int maxn=1e3+100;
const int inf=1e9+10000;
const int maxe=2e5+100;
map<string,int>mp;
struct T
{
int cost,v;
};
vector<T>a[maxn];
int cnt;
int n,B;
bool ok(int ans)//2分最小品质因子最大值
{
ll sum=0;
for(int i=1;i<cnt;i++)
{
int minn=B+1;
for(int j=0;j<a[i].size();j++)
{
if(a[i][j].v>=ans)
minn=min(minn,a[i][j].cost);
}
if(minn==B+1) return 0;
sum=sum+minn;
if(sum>B) return 0;
}
return 1;
}
int ID(string s)
{
if(!mp.count(s)) mp[s]=cnt++;
return mp[s];
}
int main()
{
int T_T;
scnaf("%d",&T_T);
while(T_T--)
{
mp.clear();
cnt=1;
int r=0;
scanf("%d%d",&n,&B);
for(int i=0;i<=n;i++)
a[i].clear();
for(int i=0;i<n;i++)
{
char cha[50],chb[50];
T aa;
scanf("%s%s%d%d",cha,chb,&aa.cost,&aa.v);
r=max(r,aa.v);
a[ID(cha)].push_back(aa);
}
int l=0,mid;
while(l<r)
{
mid=l + (r-l+1)/2;
if(ok(mid)) l=mid;
else r=mid-1;
}
printf("%d\n",l);
}
}