On the first line one positive number: the number of testcases, at most 100. After that per testcase:
One line with two integers: 1 ≤ n ≤ 1 000, the number of available components and 1 ≤ b ≤ 1 000 000 000, your budget.
n lines in the following format: 「type name price quality」, where type is a string with the type of the component, name is a string with the unique name of the component, price is an integer (0 ≤ price ≤ 1 000 000) which represents the price of the component and quality is an integer (0 ≤ quality ≤ 1 000 000 000) which represents the quality of the component (higher is better). The strings contain only letters, digits and underscores and have a maximal length of 20 characters.
Per testcase:
One line with one integer: the maximal possible quality.
1 18 800 processor 3500_MHz 66 5 processor 4200_MHz 103 7 processor 5000_MHz 156 9 processor 6000_MHz 219 12 memory 1_GB 35 3 memory 2_GB 88 6 memory 4_GB 170 12 mainbord all_onboard 52 10 harddisk 250_GB 54 10 harddisk 500_FB 99 12 casing midi 36 10 monitor 17_inch 157 5 monitor 19_inch 175 7 monitor 20_inch 210 9 monitor 22_inch 293 12 mouse cordless_optical 18 12 mouse microsoft 30 9 keyboard office 4 10
9
map+vector+二分
#include <vector> #include <map> #include <iostream> using namespace std; typedef map<string, vector<int *>> SVmap; SVmap com; int n, b; bool ok(int m); int main() { int T; scanf("%d", &T); for (int i = 0; i < T; ++i) { int l = 1000000, r = 1, pri, q; char type[20], name[20]; com.clear(); scanf("%d%d", &n, &b); for (int j = 0; j < n; ++j) { scanf("%s%s%d%d", type, name, &pri, &q); // int a[2] = {pri, q}; //vector不讓存int[2] int *p = static_cast<int *>(malloc(2 * sizeof(int))); p[0] = pri, p[1] = q; com[type].push_back(p); l = min(q, l); r = max(q, r); } for (; l < r;) { int m = l + (r - l + 1) / 2; //取兩個值中較大的那個 if (ok(m)) l = m; else r = m - 1; } printf("%d\n", l); } } bool ok(int m) { int s = 0; for (SVmap::iterator it = com.begin(); it != com.end(); it++) { int mp = b + 1; vector<int *> &v = it->second; for (int i = 0; i < v.size(); ++i) { if (v[i][1] >= m)mp = min(mp, v[i][0]); } s += mp; if (s > b) return false; } return true; }