Uva 组装电脑 12124 - Assemble

主要运用二分法查找最优解

 1 #include<iostream>
 2 #include<string>
 3 #include<vector>
 4 #include<map>
 5 using namespace std;
 6 
 7 const int maxn=1000+5;
 8 
 9 int T,n,b,cnt;
10 
11 map<string,int> id;
12 int ID(string s)
13 {
14     if(!id.count(s)) id[s]=cnt++;
15     return id[s];
16 }
17 
18 struct Component
19 {
20     int price;
21     int quality;
22 };
23 vector<Component> comp[maxn]; 
24 
25 bool ok(int q)
26 {
27     int sum=0;
28     for(int i=0;i<cnt;i++)
29     {
30         int cheapest=b+1,m=comp[i].size();
31         for(int j=0;j<m;j++)
32             if(comp[i][j].quality>=q) 
33                 cheapest=min(cheapest,comp[i][j].price);
34         if(cheapest==b+1) return false;
35         sum+=cheapest;
36         if(sum>b) return false;
37     }
38     return true;
39 }
40 
41 int main()
42 {
43     cin>>T;
44     for(int k=1;k<=T;k++)
45     {
46         cin>>n>>b;
47         cnt=0;
48         for(int i=0;i<n;i++) comp[i].clear();
49         id.clear();
50         int maxq=0;
51         for(int i=0;i<n;i++)
52         {
53             string type,name;
54             int p,q;
55             cin>>type>>name>>p>>q;
56             maxq=max(maxq,q);
57             comp[ID(type)].push_back((Component){p,q});
58         }
59         int L=0,R=maxq;
60         while(L<R)
61         {
62             int M=(L+R+1)/2;
63             if(ok(M)) L=M;else R=M-1;
64         }
65         cout<<L<<endl;
66     }
67     return 0;
68 }

 

转载于:https://www.cnblogs.com/InWILL/p/5552780.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值