2023B-组装最大可靠性设备(二分)

https://oj.algomooc.com/problem.php?id=3411
一个设备由N种类型元器件组成(每种类型元器件只需要一个,类型type编号从0~N-1,每个元器件均有可靠性属性reliability,可靠性越高的器件其价格price越贵。
而设备的可靠性由组成设备的所有器件中可靠性最低的器件决定。
给定预算S,购买N种元器件(每种类型元器件都需要购买一个),在不超过预算的情况下,请给出能够组成的设备的最大可靠性.

输入
S N,其中S为总的预算,N元器件的种类
total,表示元器件的总数,每种型号的元器件可以有多种
此后输入有total行具体器件的数据 type reliability price。
其中type为整数类型,代表元器件的类型编号从0 ~ N-1;reliabily 整数类型,代表元器件的可靠性;price 整数类型,代表元器件的价格

输出
符合预算的设备的最大可靠性,如果预算无法买产N种器件,则返回-1

样例输入 复制
500 3
6
0 80 100
0 90 200
1 50 50
1 70 210
2 50 100
2 60 150
样例输出 复制
60
提示
备注
0 <= S, price <= 10000000
0 <= N <= 100
0 <= type <= N-1
0 <= total <= 100000
0 < reliability <= 100000

二分

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int s,n;
int total;
typedef long long ll;
const int maxn=2e5+100;
int a[maxn][3];
int mi[maxn];
bool check(int mid){
	//vector<int>mi(n+1);
	for(int i=1;i<=n;i++){
		mi[i]=0x3f3f3f3f;
	}
	for(int i=1;i<=total;i++){
		if(a[i][1]>=mid){
			mi[a[i][0]]=min(mi[a[i][0]],a[i][2]);
		} 
	}
	ll cost=0;
	for(int i=1;i<=n;i++){
		cost+=mi[i];
	}
	return s>=cost;
}
int main(){
	cin>>s>>n>>total;
	for(int i=1;i<=total;i++){
		cin>>a[i][0]>>a[i][1]>>a[i][2];
		a[i][0]++;
	}
	int l=0,r=1e9,ans=-1;
	while(r>=l){
		int mid=(l+r)/2;
		if(check(mid)){
			ans=mid;
			l=mid+1;
		}
		else{
			r=mid-1;
		}
	}
	cout<<ans<<endl;
}
posted @ 2024-05-01 14:58  lipu123  阅读(90)  评论(0)    收藏  举报