暑期训练1 Gym-102623L Lottery Tickets 模拟 贪心构造
a[i] 表示可以选择数i的个数。
对于每一组询问a,求出能够组合出的被4整除的最大的数。
显然是贪心构造,被4整除就等价于末尾两位被4整除。
需要注意的点有: 前导0,单个数字
这里通过string自带的比较性质写了一个cmp函数。
void solve() { memset(val, 0, sizeof val); vector<string> v; for (int i = 0; i < 10; i++) { int x = readint(); val[i] += x; } int sum = 0; for (int i = 1; i < 10; i++) sum += val[i]; if (!sum) { puts("0"); return; } int f1, f2; for (int i = 0; i < 100; i += 4) { if (i < 10) f1 = 0; else f1 = get1(i); f2 = get2(i); if (!f1 && val[f2]) { string xx; xx.push_back(f2 + '0'); v.push_back(xx); } if (val[f1] && val[f2]) { val[f1]--; val[f2]--; if (f1 == f2 && val[f1] < 0) { val[f1]++; val[f2]++; continue; } string tmp; for (int i = 9; i >= 0; i--) for (int j = 0; j < val[i]; j++) tmp.push_back(i + '0'); tmp.push_back(f1 + '0'); tmp.push_back(f2 + '0'); val[f1]++, val[f2]++; int head = 0; while (tmp[head] == '0') head++; tmp = tmp.substr(head); v.push_back(tmp); } } if (!v.empty()) { sort(v.begin(), v.end(), cmp); cout << v.back() << "\n"; return; } puts("-1"); } int main() { int T = readint(); while (T--) solve(); }