WOJ1303-Assemble

Recently your team noticed that the computer you use to practice for programming contests 
is not good enough anymore. Therefore, you decide to buy a new computer. 
To make the ideal computer for your needs, you decide to buy separate components and assemble the computer yourself. You need to buy exactly one of each type of component. 
The problem is which components to buy. As you all know, the quality of a computer is equal to the quality of its weakest component. Therefore, you want to maximize the quality 
of the component with the lowest quality, while not exceeding your budget. 

输入格式

On the first line one positive number: the number of testcases, at most 100. After that per testcase:

One line with two integers: 1 ≤ n ≤ 1 000, the number of available components and
1 ≤ b ≤ 1 000 000 000, your budget.

n lines in the following format: type name price quality, where type is a string with the type of the component, name is a string with the unique name of the com- ponent, price is an integer (0 ≤ price ≤ 1 000 000) which represents the price of the component and quality is an integer (0 ≤ quality ≤ 1 000 000 000) which represents
the quality of the component (higher is better). The strings contain only letters, digits and underscores and have a maximal length of 20 characters.
It will always possible to construct a computer with your budget.

输出格式

Per testcase:

One line with one integer: the maximal possible quality.

样例输入

1
18  800
processor  3500_MHz  66  5
processor  4200_MHz  103  7
processor  5000_MHz  156  9
processor  6000_MHz  219  12
memory  1_GB  35  3
memory  2_GB  88  6
memory  4_GB  170  12
mainbord  all_onboard  52  10
harddisk  250_GB  54  10
harddisk  500_FB  99  12
casing  midi  36  10
monitor  17_inch  157  5
monitor  19_inch  175  7
monitor  20_inch  210  9
monitor  22_inch  293  12
mouse  cordless_optical  18  12
mouse  microsoft  30  9
keyboard  office  4  10

样例输出

9


#include <cstdio>
#include <string>
#include <map>
#include <vector>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;

int Case;//组数
int n;//配件的数目
int b;//预算
int cnt;//种类标号
map<string,int> id;//将类型映射为id
int ID(string s)//将类型名转化为对应id
{
    if(!id.count(s)) id[s]=cnt++;
    return id[s];
}
struct Component{
    int price;//价格
    int quality;//质量因子
};
vector<Component> comp[1010];//comp[i]代表第i种类型的组件
bool check(int q)//判断质量因子大于等于q的组件能否组成不超过b元的电脑
{
    int sum=0;//花销
    for(int i=0;i<cnt;++i)//枚举配件种类
    {
        int m=comp[i].size();//配件个数
        int mincost=b+1;//当前种类配件质量因子不小于q的最小花费
        for(int j=0;j<m;++j){
            if(comp[i][j].quality>=q) mincost=min(mincost,comp[i][j].price);
        }
        if(mincost==b+1) return false;//若没找到符合要求的组件,则失败
        sum+=mincost;
        if(sum>b) return false;//花销超过了b,失败
    }
    return true;
}
int main(){
    scanf("%d",&Case);
    while(Case--){
        scanf("%d %d",&n,&b);
        cnt=0;//种类标号
        for(int i=0;i<n;++i) comp[i].clear();
        id.clear();
        int maxq=0,minq=0x7fffffff;
        for(int i=0;i<n;++i){
            char type[22],name[22];
            int price,quality;
            scanf("%s%s%d%d",type,name,&price,&quality);
            comp[ID(type)].push_back((Component){price,quality});
            maxq=max(quality,maxq);//最大质量因子
            minq=min(quality,minq);//最小质量因子
        }
        while(minq<maxq)//二分搜索
        {
            int mid=minq+(maxq-minq+1)/2;//mid=(maxq+minq)/2 会超时
            //等价于:int mid=(maxq+min+1)/2;
            if(check(mid)) minq=mid;//若mid值可以成功,则答案>=mid
            else maxq=mid-1;//若mid失败,则答案<mid
        }
        printf("%d\n",minq);
   }
   return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值