Assemble UVALive - 3971 二分法

题意:

你需要组装电脑,一共有n个配件,b的预算,n个配件中包含了各类电脑配件的价格和品质。组成一台计算机的配件的品质可能不同,但其性能取决于品质最差的那个配件。问在预算内可以使得电脑达到的最大性能是多少。

思路:

大致思路是在0~最大品质之间二分,看某个品质当前预算是否能够满足品质为q的电脑,每次选取零件的时候我们总是选择满足条件中的最便宜的零件。如此二分下去,最终就能得到答案。此题因为我们需要把零件存入不同的数组中,因此在输入的时候需要把配件的名称转化为下标,我们可以使用一个 map 来实现这个功能。

代码:

#include <bits/stdc++.h>
#define N 1005
#define fp(PP,QQ,RR) for(int PP = QQ;PP < RR;PP++)
using namespace std;
int n,b,ro,k,mq;
struct com{
    int p,q;
};
map <string,int> mp;
int id(string s){
    return mp.count(s) ? mp[s] : (mp[s] = k ++);
}
vector <com> coms[N];
bool ok(int q){
    int sum = 0;
    for(int i = 0;i < k;i ++){
        int chepest = b + 1;
        fp(j,0,coms[i].size()){
            if(coms[i][j].q >= q && coms[i][j].p < chepest){
                chepest = coms[i][j].p;
            }
        }
        if(chepest == b + 1 || sum + chepest > b) return 0;
        sum += chepest;
    }
    return 1;
}
int main(void)
{
    cin >> ro;
    while(ro --){
        mp.clear();
        mq = k = 0;
        cin >> n >> b;
        fp(i,0,n){
            coms[i].clear();
            string name,t;int p,q;
            cin >> name >> t >> p >> q;
            mq = max(q,mq);
            coms[id(name)].push_back((com){p,q});
        }
        int l = 0,r = mq,m;
        while(l < r){
            m = l + (r - l + 1) / 2;
            if(ok(m)) l = m;
            else r = m - 1;
        }
        cout << l << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值