LA 3971 Assemble / 二分

有n个物品 属性有 种类  名字(没用)价格 品质 每种类型选一个 使总价格不超过b  并且最小品质最大 二分品质

#include <cstdio>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1010;
int cnt;
int n,m;
map <string,int> id;
struct node
{
	int pri;
	int qua;
};
int ID(string s)
{
	if(!id.count(s))
		id[s] = cnt++;
	return id[s];
}
vector <node> a[MAXN];

bool ok(int q)
{
	int sum = 0,i,j;
	for(i = 0; i < cnt; i++)
	{
		int len = a[i].size();
		int cheap = m + 1;
		for(j = 0; j < len; j++)
		{
			if(a[i][j].qua >= q)
				cheap = min(cheap,a[i][j].pri);
		}
		if(cheap > m)
			return false;
		sum += cheap;
		if(sum > m)
			return false;
	}
	return true;
}
int main()
{
	char s1[30];
	char s2[30];
	int t;
	int i,j;
	int l,r,maxq;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d",&n,&m);
		cnt = 0;
		maxq = 0;
		for(i = 0; i < n; i++)
			a[i].clear();
		id.clear();
		int p,q;
		for(i = 1;i <= n; i++)
		{
			scanf("%s %s %d %d",s1,s2,&p,&q);
			maxq = max(maxq,q);
			a[ID(s1)].push_back((node){p,q});
		}
		l = 0;
		r = maxq;		
		while(l < r)
		{
			int M = l + (r-l+1)/2; //(l+r)>>1 这样会超时的 
			if(ok(M))
				l = M;
			else
				r = M - 1;
		}
		printf("%d\n",l);
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值