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;
}
posted @ 2020-10-20 10:45  Achtoria  阅读(73)  评论(0编辑  收藏  举报