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