1. 程式人生 > 實用技巧 >CF388C Fox and Card Game

CF388C Fox and Card Game

基於觀察可以發現,雙方都一定能保證取到每一列靠近自己的 \(\lfloor \frac{k}{2} \rfloor\) 個元素。

那麼一旦一個人想要取另一個人能必然能取的部分,另一個人必然可以不讓其取到。

因此,一個人去取對方一定能取到的部分是無意義的。

因此雙方的策略必然都是先將靠近自身的 \(\lfloor \frac{k}{2} \rfloor\) 個元素取完,在搶中間剩下的元素。

那麼對於最後剩下的元素,每次貪心的選擇一定是最優的,因此雙方的選擇必然都是每次選取當前最大的元素。

那麼我們按照這個流程模擬即可,複雜度 \(O(\sum s_i + n \log n)\)

#include <bits/stdc++.h>
using namespace std;
#define rep(i, l, r) for (int i = l; i <= r; ++i)
#define dep(i, l, r) for (int i = r; i >= l; --i)
const int N = 100 + 5;
int n, m, s, x, A, B, a[N];
int read() {
    char c; int x = 0, f = 1;
    c = getchar();
    while (c > '9' || c < '0') { if(c == '-') f = -1; c = getchar();}
    while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}
int main() {
    n = read();
    rep(i, 1, n) {
        s = read();
        if(s & 1) {
            rep(j, 1, s / 2) A += read();
            a[++m] = read();
            rep(j, 1, s / 2) B += read();
        }
        else {
            rep(j, 1, s / 2) A += read();
            rep(j, 1, s / 2) B += read();
        }
    }
    sort(a + 1, a + m + 1);
    dep(i, 1, m) {
        if((m - i + 1) & 1) A += a[i];
        else B += a[i];
    }
    printf("%d %d", A, B);
    return 0;
}