又是一道二分题目
先二分质量
在计算出最少花费
#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; }