//方法1:
#include <iostream>
#include <cstdio>
#include <map>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
struct compute
{
int zl,jg,pz;
}d[1005];
int init[1005],n,w,Count;
map<string,int> ma;
int cmp(compute a,compute b)
{
return a.pz<b.pz;
}
int weight(int middle)
{
int i,j,s;
memset(init,-1,sizeof(init));
for(i=middle;i<n;i++)
{
if(init[d[i].zl]==-1) init[d[i].zl]=d[i].jg;
else if(init[d[i].zl]>d[i].jg) init[d[i].zl]=d[i].jg;
}
for(s=i=0;i<Count;i++)
if(init[i]==-1) return 0;
else s+=init[i];
if(s>w) return 0;
else return 1;
}
int binary()
{
int left=0,right=n-1,middle;
while(left<right)
{
middle=(left+right+1)/2;//此处要加1啊,不然遇到8,9就成死循环,超时就在这!!!
if(weight(middle)) left=middle;
else right=middle-1;
}
return d[left].pz;
}
int main(int argc, char *argv[])
{
int t,i,j;
string s; char a[25];
cin>>t;
while(t--)
{ Count=0;
scanf("%d%d",&n,&w);
for(i=0;i<n;i++)
{ scanf("%s",a);
s=a;
scanf("%s%d%d",a,&d[i].jg,&d[i].pz);
if(ma.find(s)==ma.end()) ma[s]=Count++;
d[i].zl=ma[s];
}
ma.clear();
sort(d,d+n,cmp);
printf("%d\n",binary());
}
return 0;
}
方法2:
#include <iostream>
#include <cstdio>
#include <map>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
struct compute
{
int jg,pz;
};
vector<compute> d[1005];
int n,w,Count;
map<string,int> ma;
int weight(int middle)
{
int i,j,s,k,minjg,kk;
for(k=s=i=0;i<Count;i++)
{ minjg=1000000005;
for(kk=j=0;j<d[i].size();j++)
if(d[i][j].pz>=middle)
{
if(minjg>d[i][j].jg) minjg=d[i][j].jg;
kk=1;
}
if(kk){s+=minjg;k++;}
if(s>w) return 0;
}
return k==Count&&s<=w;
}
int binary(int left,int right)
{
int middle;
while(left<right)
{
middle=(left+right+1)/2;
if(weight(middle)) left=middle;
else right=middle-1;
}
return left;
}
int main()
{
int t,i,j,minpz,maxpz;
compute tt;
string s; char a[25];
scanf("%d",&t);
while(t--)
{ Count=0; minpz=1000000005; maxpz=1000000005;
scanf("%d%d",&n,&w);
for(i=0;i<n;i++)
{ scanf("%s",a);
s=a;
scanf("%s%d%d",a,&tt.jg,&tt.pz);
if(tt.pz<minpz)minpz=tt.pz;
if(tt.pz>maxpz)maxpz=tt.pz;
if(!ma.count(s)) ma[s]=Count++;
d[ma[s]].push_back(tt);
}
printf("%d\n",binary(minpz,maxpz));
ma.clear();
for(i=0;i<Count;i++)
d[i].clear();
}
return 0;
}