组装电脑
时间限制: 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 }