题意:给出预算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 }