暑期訓練1 Gym-102623L Lottery Tickets 模擬 貪心構造
阿新 • • 發佈:2020-08-19
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(); }