题意:给出预算b以及电脑零件n,每种类型均要买一个,求在预算范围内,所有零件配置最低的最大值。

题解:二分答案

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<map>
 5 #include<string>
 6 #include<vector>
 7 using namespace std;
 8 map<string,int> MP;
 9 const int inf=0x3f3f3f3f;
10 struct data
11 {
12     int p,q;
13     data(){}
14     data(int _p,int _q){p=_p;q=_q;}
15 };
16 vector<data> po[1005];
17 int n,b,num;
18 bool check(int qq)
19 {
20     int res=b;
21     for(int i=1;i<=num;i++)
22     {
23         int len=po[i].size(),mm=inf;
24         for(int j=0;j<len;j++)
25             if(qq<=po[i][j].q&&po[i][j].p<mm)
26                 mm=po[i][j].p;
27         if(mm==inf)
28             return false;
29         else
30             res-=mm;
31         if(res<0)
32             return false;
33     }
34     return true;
35 }
36 int main()
37 {
38     int T;
39     for(scanf("%d",&T);T;T--)
40     {
41         num=0;
42         scanf("%d%d",&n,&b);
43         MP.clear();
44         for(int i=0;i<n;i++)
45         {
46             char s[100],tp[100];
47             int p,q;
48             scanf("%s %s %d %d",s,tp,&p,&q);
49             if(MP.find(s)==MP.end())
50                 po[MP[s]=++num].clear();
51             po[MP[s]].push_back(data(p,q));
52         }
53         int ans,ll=0,rr=1000000001,mid;
54         while(ll<=rr)
55         {
56             mid=((long long)ll+rr)>>1;
57             if(check(mid))
58             {
59                 ans=mid;
60                 ll=mid+1;
61             }
62             else
63             {
64                 rr=mid-1;
65             }
66         }
67         printf("%d\n",ans);
68     }
69     return 0;
70 }