HOJ 2608
又是一道二分题目
先二分质量
在计算出最少花费
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int mod=100007;
const int bas=127;
const int inf=0x3f3f3f3f;
inline int read(){
int x=0,f=1,ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct stu{
int id,w;
};
inline int cmp(stu a,stu b){
if(a.id==b.id) return a.w<b.w;
return a.id>b.id;
}
vector<stu> v[1005];
int n,b,cnt;
inline bool ok(int x){
int ans=0;
for(int i=1;i<=cnt;i++){
int res=inf;
for(int j=0;j<v[i].size();j++)
if(v[i][j].id>=x)
res=min(res,v[i][j].w);
if(res==inf) return 0;
ans+=res;
}
if(ans<=b) return 1;
return 0;
}
char s[25];
inline int cal(){
int res=0,len=strlen(s);
for(int i=0;i<len;i++) res=(res*bas+s[i])%mod;
return res;
}
int shu[100007];
int main(){
int T=read();
while(T--){
memset(shu,0,sizeof(shu));
for(int i=1;i<=1000;i++) v[i].clear();
cnt=0;n=read(),b=read();
int l=0,r=0;
for(int i=1;i<=n;i++){
scanf("%s",s);
int num=cal();
if(!shu[num]) shu[num]=++cnt;
scanf("%s",s);
int w=read(),id=read();
r=max(r,id);
stu liu;liu.id=id;liu.w=w;
v[shu[num]].push_back(liu);
}
// puts("x");
while(l<r){
int mid=(l+r)>>1;
if(ok(mid+1)) l=mid+1;
else r=mid;
}
printf("%d\n",l);
}
return 0;
}

浙公网安备 33010602011771号