LA 3971 Assemble(二分)

题目:

给你b元钱,让你组装一台电脑,有n个配件,属性有 种类 名字 价格 品质,每种类型选至少一个,并且最小品质最大。输出这个最大的最小品质。

白书上说了,最小值最大的问题一般是二分来求解答案。在这里我们二分这个品质。这个题在判断时因为数据较小,所以线性查找了,如果遇到大数据就要排序+lower_bound了...

代码如下:

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

 

posted @ 2016-10-25 11:05  抓不住Jerry的Tom  阅读(326)  评论(0编辑  收藏  举报