组装电脑(二分答案)

组装电脑

时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 [提交][状态][讨论版]

题目描述

你有b块钱,想要组装一台电脑。给出n个配件各自的种类,品质因子和价格,要求每种类型配件给买一个,总价不超过b,且“品质最差的配件”的品质因子尽量大。

输入

输入的第一行为测试数据T(T<=1000)。每组数据的第一行为两个正整数n(1<=n=1000)和b(1<=b<=109),即配件的数目和预算;以下n行每行描述一个配件,依次为种类,名称,价格和品质因子。其中价格为不超过106的非负整数;品质因子是不超过109的非负整数(越大越好);种类和名称则由不超过20个字母,数字和下划线组成。输入保证总有解。

输出

对于每组数据,输出配件最小的品质因子的最大值。

样例输入

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
下面的代码是刘汝佳蓝本p28上的,啃完之后就打了出来,作了注释,便于自己理解;
还是二分答案 问什么分什么 问的是品质因子 那么就二分品质因子,限制条件就是价格了;
【代码】
 1 include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<string>
 5 #include<vector>//动态数组 
 6 #include<map>//关联式容器
 7 using namespace std;
 8 int cnt;//组件的种类数 
 9 map<string,int>id; 
10 const int MAXN=1009;
11 struct component//定义结构体,每个组件的质量和价格 
12 {
13     int price,quality;
14 };
15 vector<component>comp[MAXN];//结构体类型的动态数组 
16 int n,b;//元件个数,钱;
17 int ID(string s)
18 {
19     if(!id.count(s))id[s]=cnt++;//如果这个类型没有出现,组件类型数+1; 
20     return id[s];//返回它是第几个类型 
21 }
22 bool ok(int q)//品质因子不小于q的组件能否组成一个不超过b的电脑 
23 {
24     int sum=0;//价钱 
25     for(int i=0;i<cnt;i++)//列举每个类型 
26     {
27         int cheapest=b+1,m=comp[i].size();//m为每个类型的组件数 
28         for(int j=0;j<m;j++)
29         if(comp[i][j].quality>=q)cheapest=min(cheapest,comp[i][j].price);//找大于q价格中最小的那一个 
30         if(cheapest==b+1)return 0;//如果没找到说明不能组装电脑 
31         sum+=cheapest;//累计价格 
32         if(sum>b)return 0;//如果当前价格比b大说明不能组装电脑 
33     }
34     return 1;//进行到了这一步,说明可以组装 
35  } 
36 int main()
37 {
38     int T;//T为测试数据 
39     scanf("%d",&T);//输入 
40     while(T--)
41     {
42         scanf("%d%d",&n,&b);//输入组件数和价钱 
43         cnt=0;
44         for(int i=0;i<n;i++)
45         comp[i].clear();//清空
46         id.clear();//初始化 
47         int maxq=0;//确定二分区间右端点,为品质因子最大值 
48         for(int i=0;i<n;i++)//输入n个配件 
49         {
50             char type[30],name[30];//类型 名字 
51             int p,q;
52             scanf("%s%s%d%d",&type,&name,&p,&q);
53             maxq=(maxq,q);
54             comp[ID(type)].push_back((component){p,q});//放入动态数组,ID(type)为这个类型是第几个,放入第几个类型中 
55          } 
56          int l=0,r=maxq;//二分答案过程 
57          while(l<r)
58          {
59              int m=l+(r-l+1)/2;
60              if(ok(m))l=m;//m是否可以 
61              else
62              r=m-1;
63          }
64          printf("%d",l);//输出答案 
65      } 
66      return 0;
67 }
原文地址:https://www.cnblogs.com/zzyh/p/6636928.html