CF388C Fox and Card Game
阿新 • • 發佈:2020-10-20
基於觀察可以發現,雙方都一定能保證取到每一列靠近自己的 \(\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; }