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 }