UVALive - 3971 Assemble

来源:互联网 发布:炉石淘宝友谊赛安全吗 编辑:程序博客网 时间:2024/05/02 17:18

题目大意:有N个组件,每个组件都有相应的type,name,price,quality,给你B钱,要求你每种type都要选择一样,在价格不超过B的情况下,使quality的最小值达到最大

解题思路:最小值最大化的情况,就一一枚举,用二分法进行枚举,枚举出来的结果一定是其中一种type的最小

#include<cstdio>#include<cstring>#include<vector>#include<map>#include<string>#define maxn 1010using namespace std;struct Computer{int price;int quality;};vector<Computer> C[maxn];map<string,int> M;int N, B, num;int change(string s) {if(!M.count(s))M[s] = num++;return M[s];}bool judge(int q) {int sum = B, size, MIN;for(int i = 0; i < num; i++) {size = C[i].size();MIN = B + 1;for(int j = 0; j < size; j++) if(C[i][j].quality >= q)MIN = min(MIN,C[i][j].price);sum -= MIN;if(sum < 0)return false;}return true;}int main() {int test;scanf("%d",&test);while(test--) {scanf("%d%d",&N, &B);int MAX_quality = -1, p, q;char t1[30], t2[30];num = 0; M.clear();for(int i = 0; i < N; i++)C[i].clear();for(int i = 0; i < N; i++){scanf("%s%s%d%d",t1, t2, &p, &q);MAX_quality = max(MAX_quality, q);C[change(t1)].push_back((Computer){p,q});}int L = 0, R = MAX_quality, mid;while(L < R) {mid = (L + R + 1) / 2;if(judge(mid)) L = mid;elseR = mid - 1;}printf("%d\n",L);}return 0;}


0 0