View Code
Problem : 2333 ( Assemble ) Judge Status : Accepted
RunId : 5747850 Language : C++ Author : billforum
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stdio.h>
using namespace std;
const int N=1005;
const int M=1000000005;
struct node
{
char type[25];
int pri,qua;
};
node nd[N];
int mark[N];
int n,p,mnum;
bool cmp(node x,node y)
{
if(strcmp(x.type,y.type)==0) return (x.qua>y.qua);
else return(strcmp(x.type,y.type)<0);
}
bool test(int x)
{
int sum=0;
for(int i=0;i<mnum;i++)
{
int minx=M;
for(int j=mark[i];j<mark[i+1];j++)
{
if(x<=nd[j].qua)
{
minx=min(minx,nd[j].pri);
}
}
if(minx==M) return false;
sum+=minx;
}
if(sum>p) return false;
else return true;
}
int main()
{
int t,Min,Max;
bool flag=0;
char name[25];
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&p);
Min=1000000005;
Max=0;
mnum=0;
flag=0;
for(int i=0;i<N;i++)
mark[i]=0;
for(int i=0;i<n;i++)
{
scanf("%s %s %d %d",nd[i].type,name,&nd[i].pri,&nd[i].qua);
if(nd[i].qua<Min) Min=nd[i].qua;
if(nd[i].qua>Max) Max=nd[i].qua;
}
sort(nd,nd+n,cmp);
for(int i=1;i<n;i++)
{
if(strcmp(nd[i].type,nd[i-1].type)!=0)
mark[++mnum]=i;
}
mark[++mnum]=n;
while(Min<=Max)
{
int mid=(Min+Max)>>1;
if(test(mid))
{
flag=1;
Min=mid+1;
}
else
Max=mid-1;
}
if(flag==1) printf("%d\n",Max);
else printf("0\n");
}
return 0;
}