Run Time: 0.080
Ranking (as of 2016-09-27): 321 out of 391
Language: C++
Sort of dynamic programming, although very slow.
/* UVa 12124 - Assemble To build using Visual Studio 2012: cl -EHsc -O2 UVa_12124_Assemble.cpp */ #include <algorithm> #include <string> #include <vector> #include <map> #include <cstdio> using namespace std; const int n_max = 1000, nr_chars_max = 20; #ifdef DEBUG void print_qualities(const map<int, int>& qualities) { printf("%d\n ", qualities.size()); for (map<int, int>::const_iterator i = qualities.begin(); i != qualities.end(); ++i) printf("%d:%d ", i->first, i->second); putchar('\n'); } #endif int main() { int t; scanf("%d", &t); while (t--) { int n, b; scanf("%d %d", &n, &b); int nr_types = 0; map<string, int> types; vector< map<int, int> > components; while (n--) { char type[nr_chars_max + 1]; int price, quality; scanf("%s %*s %d %d", type, &price, &quality); pair<map<string, int>::iterator, bool> sr = types.insert(make_pair(string(type), nr_types)); if (sr.second) { nr_types++; components.push_back(map<int, int>()); } pair<map<int, int>::iterator, bool> cr = components[sr.first->second].insert(make_pair(quality, price)); if (!cr.second && cr.first->second > price) cr.first->second = price; }; vector< map<int, int> > qualities(nr_types); for (map<int, int>::const_iterator k = components[0].begin(); k != components[0].end(); ++k) { int q = k->first, p = k->second; if (p <= b) qualities[0].insert(make_pair(q, p)); } #ifdef DEBUG print_qualities(qualities[0]); #endif for (int i = 1; i < nr_types; i++) { for (map<int, int>::const_iterator j = qualities[i - 1].begin(); j != qualities[i - 1].end(); ++j) { int quality = j->first, price = j->second; for (map<int, int>::const_iterator k = components[i].begin(); k != components[i].end(); ++k) { int q = min(quality, k->first), p = price + k->second; if (p <= b) { pair<map<int, int>::iterator, bool> qr = qualities[i].insert(make_pair(q, p)); if (!qr.second && qr.first->second > p) qr.first->second = p; } } } #ifdef DEBUG print_qualities(qualities[i]); #endif } printf("%d\n", qualities[nr_types - 1].rbegin()->first); } return 0; }
No comments:
Post a Comment