1. 程式人生 > 實用技巧 >暑期訓練1 Gym-102623L Lottery Tickets 模擬 貪心構造

暑期訓練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(); }