Assemble UVALive - 3971 (最小值最大化,二分解决)

题意:你要组成一台电脑,电脑由多个组成,每个组件有多个可供选择,每个组件有两个值p,q,代表价格和质量,给定代表你的钱,要求你买的组件不超过b的情况下组成一个电脑并且q最大(备注:电脑的q值等于所有组件的q值的最小值),问q为多少? 这种就是最小值最大化。(最小是一种限制,在这种限制下看能尽量更大的值)

思路:发现q满足单调性,二分,用map和vector辅助求解!

代码:

#include<cstdio>
#include<vector>
#include<iostream>
#include<iostream>
#include<map>
using namespace std;
#define inf 1000000000
struct Node{
	int p,q;
};
map<string,int>M;
vector<Node>save[1005];
int cnt;
int IsAppear(string type){
	if(M.count(type)==0) return M[type]=cnt++;
	else return M[type];
}
bool check(int q, int b){
	int sum = 0;
	for(int i = 0; i<cnt; i++){
		int minPri = b + 1;
		for(int j = 0; j<save[i].size(); j++){
			if(save[i][j].p < minPri && save[i][j].q >= q) minPri = save[i][j].p;
		} 
		sum += minPri;
		if(minPri == b+1) return false;
		if(sum > b) return false;
	}
	return true;
}
int main()
{
	int t,n,b;
	cin>>t;
	while(t--){
		cin>>n>>b;
		//initial()
		cnt = 0;
		M.clear();
		for(int i = 0; i<1005; i++) save[i].clear();
		char type[30],name[30];
		int pri,qua;
		for(int i = 1; i<=n; i++){
			cin>>type>>name>>pri>>qua;
			int id = IsAppear(type);
			save[id].push_back((Node){pri,qua});
		}
		int left = 0, right = inf;
		while(left<right){
			int mid = (left+right+1)/2;
			if(check(mid, b)) left = mid;
			else right = mid-1;
		}
		printf("%d\n",left);
	}
	return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值