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;
}

  

猜你喜欢

转载自www.cnblogs.com/gcyyzf/p/9648426.html
今日推荐