#include using namespace std; struct Item { string name; int q; long long v, m, l; }; string input_str; int pos = 0; void skip_ws() { while (pos < input_str.size() && (input_str[pos] == ' ' || input_str[pos] == '\n' || input_str[pos] == '\t' || input_str[pos] == '\r')) pos++; } long long parse_num() { skip_ws(); long long num = 0; while (pos < input_str.size() && isdigit(input_str[pos])) { num = num * 10 + (input_str[pos] - '0'); pos++; } return num; } string parse_name() { skip_ws(); if (pos >= input_str.size() || input_str[pos] != '"') assert(false); pos++; string s; while (pos < input_str.size() && input_str[pos] != '"') { s += input_str[pos]; pos++; } if (pos >= input_str.size() || input_str[pos] != '"') assert(false); pos++; return s; } long long greedy(const vector& items, vector& cnts, function pri_func) { int n = items.size(); vector order(n); iota(order.begin(), order.end(), 0); sort(order.begin(), order.end(), [&](int a, int b) { return pri_func(items[a]) > pri_func(items[b]); }); long long rem_m = 20000000LL; long long rem_v = 25000000LL; fill(cnts.begin(), cnts.end(), 0); long long total = 0; for (int idx : order) { const auto& it = items[idx]; if (it.m == 0 || it.l == 0) continue; long long mk = rem_m / it.m; long long lk = rem_v / it.l; long long k = min({(long long)it.q, mk, lk}); if (k > 0) { cnts[idx] = (int)k; total += k * it.v; rem_m -= k * it.m; rem_v -= k * it.l; } } return total; } int main() { input_str.assign((istreambuf_iterator(cin)), istreambuf_iterator()); pos = 0; skip_ws(); if (pos >= input_str.size() || input_str[pos] != '{') assert(false); pos++; vector items; while (true) { skip_ws(); if (pos >= input_str.size() || input_str[pos] == '}') { pos++; break; } string name = parse_name(); skip_ws(); if (pos >= input_str.size() || input_str[pos] != ':') assert(false); pos++; skip_ws(); if (pos >= input_str.size() || input_str[pos] != '[') assert(false); pos++; int qq = (int)parse_num(); skip_ws(); if (pos < input_str.size() && input_str[pos] == ',') pos++; long long vv = parse_num(); skip_ws(); if (pos < input_str.size() && input_str[pos] == ',') pos++; long long mm = parse_num(); skip_ws(); if (pos < input_str.size() && input_str[pos] == ',') pos++; long long ll = parse_num(); skip_ws(); if (pos < input_str.size() && input_str[pos] == ']') pos++; items.push_back({name, qq, vv, mm, ll}); skip_ws(); if (pos < input_str.size() && input_str[pos] == ',') pos++; else if (pos < input_str.size() && input_str[pos] == '}') { pos++; break; } } assert(items.size() == 12); auto combined_pri = [&](const Item& it) -> double { double cm = (double)it.m / 20000000.0; double cv = (double)it.l / 25000000.0; double c = cm + cv; return c > 0 ? it.v / c : 0; }; auto mass_pri = [&](const Item& it) -> double { return it.m > 0 ? it.v / (double)it.m : 0; }; auto vol_pri = [&](const Item& it) -> double { return it.l > 0 ? it.v / (double)it.l : 0; }; auto totalv_pri = [&](const Item& it) -> double { return (double)it.q * it.v; }; vector> strategies = {combined_pri, mass_pri, vol_pri, totalv_pri}; vector best_cnt(12, 0); long long max_val = -1; for (const auto& strat : strategies) { vector temp(12, 0); long long val = greedy(items, temp, strat); if (val > max_val) { max_val = val; best_cnt = temp; } } cout << "{" << endl; for (int i = 0; i < 12; i++) { if (i > 0) cout << "," << endl; cout << " \"" << items[i].name << "\": " << best_cnt[i]; } cout << endl << "}" << endl; return 0; }