CS Academy Unfair Game

リンク : https://csacademy.com/contest/archive/task/unfair_game/

 

問題概要

AlexとBenがゲームをする。長さNの数列を扱う。Alexは自由に1個以上の数列を取ることができる。Benは1個の数列しか取ることができない。Alexは取った数列の合計を最大化しようとし、BenはAlexが取る数列の合計を最小化するとする。2人が最適な行動をする場合、Alexの取る数列の合計の最大はいくつか。

 

解説

タイトル通り不公平だと思った。もし、数列がすべて正ならAlexが最初にすべて取ってしまえば最大化になる。そうではない場合を考える。数列の中の最小値は必ず負になる。これはAlexは取りたくない。だから、Benに押し付ける。しかし、押し付けるためにはAlexは2番目の最小値をとる必要がある。このように小さいほうから考えると考えやすい。注意することとして、最小値は必ずBenに取らせるため、Alexの最初の操作で負を含む可能性があること。

LL n,ans,a[110000];

int main() {
    cin >> n;
    rep(i, n) {
        cin >> a[i];
    }
    sort(a, a + n);
    if (a[0] >= 0) {
        rep(i, n)
            ans += a[i];
    }
    else {
        rep(i, n) {
            if (a[i] > 0)ans += a[i];
            else {
                if (i == n-1)ans += a[i];
                else if (i % 2 == 0) {}
                else { ans += a[i]; }
            }
        }
    }
    cout << ans << endl;
    return 0;
}