uvalive3971(二分)

Posted yijiull

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uvalive3971(二分)相关的知识,希望对你有一定的参考价值。

题目连接:https://vjudge.net/problem/UVALive-3971

 1 #include<cstdio>
 2 #include<string>
 3 #include<vector>
 4 #include<map>
 5 using namespace std;
 6 const int maxn=1010;
 7 int n,b;
 8 
 9 int cnt;
10 map<string,int> id;
11 struct node
12 {
13     int p,q;
14 };
15 vector<node> cat[maxn];
16 int ID(string s)
17 {
18     if(!id.count(s)) id[s]=cnt++;
19     return id[s];
20 }
21 bool ok(int rq)
22 {
23     int sum=0;
24     for(int i=0;i<cnt;i++)
25     {
26         int cheapest=b+1,m=cat[i].size();
27         for(int j=0;j<m;j++)
28             if(cat[i][j].q>=rq) cheapest=min(cheapest,cat[i][j].p);
29         if(cheapest==b+1) return 0;
30         sum+=cheapest;
31         if(sum>b) return 0;
32     }
33     return 1;
34 }
35 
36 int main()
37 {
38     int 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++) cat[i].clear();
45         id.clear();
46         int maxq=0;
47         for(int i=0;i<n;i++)
48         {
49             char type[30],name[30];
50             int p,q;
51             scanf("%s%s%d%d",type,name,&p,&q);
52             maxq=max(maxq,q);
53             cat[ID(type)].push_back(node{p,q});
54         }
55         int L=0,R=maxq;
56         while(L<R)   //
57         {
58             int M=L+(R-L+1)/2;
59             if(ok(M)) L=M;
60             else R=M-1;
61         }
62         printf("%d\n",L);
63     }
64 
65 }

 

以上是关于uvalive3971(二分)的主要内容,如果未能解决你的问题,请参考以下文章

uvalive 3971 Assemble

[2016-03-19][UVALive][3971][Assemble]

LA 3971 组装电脑(二分)

UVALive 3971 组装电脑

UVALive - 4513 Stammering Aliens ——(hash+二分 || 后缀数组加二分)

Tracer Deployment UVALive - 8271 二分图匹配