shinka-backup / docker_space /frontier_cs_1 /examples /grok4fastreasoning.cpp
JustinTX's picture
Add files using upload-large-folder tool
14c9c2b verified
#include <bits/stdc++.h>
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<Item>& items, vector<int>& cnts, function<double(const Item&)> pri_func) {
int n = items.size();
vector<int> 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<char>(cin)), istreambuf_iterator<char>());
pos = 0;
skip_ws();
if (pos >= input_str.size() || input_str[pos] != '{') assert(false);
pos++;
vector<Item> 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<function<double(const Item&)>> strategies = {combined_pri, mass_pri, vol_pri, totalv_pri};
vector<int> best_cnt(12, 0);
long long max_val = -1;
for (const auto& strat : strategies) {
vector<int> 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;
}