[ARC164] C - Reversible Card Game

[Q] https://atcoder.jp/contests/arc164/tasks/arc164_c

考察
・大きい数字が出ているカードを「裏返し」と考える。
・シミュレーションすると、Bobがかなり有利っぽい。
・Bobは次の2パターンしかなさそう。
1. 全部のカードの最大値をとれる
2. 1ペアだけ最大をとれない
取れないときはどんなとき?
・場の全カードが低い値になってしまった場合、1ペアだけBobは低い値を取らざるを得ない。その後の展開はAliceが裏返したものをBobが選び続けるので、大きい値をとり続けられる。

低い1ペアをとらされるのはどんなとき?
大きい数字が出ているカードを「裏返し」と考えると。
1. Alice行動前に裏返しのカードが偶数のとき、Bobは全部のカードの最大値をとれる。
Aliceがひっくり返すと、奇数枚のカードが裏返しになるから、必ずBobは大きい値をとれる。
2. Alice行動前に裏返しのカードが奇数のとき、Bobは1枚だけ低い値をとらされるようだ。
いずれ1枚だけ裏返っている状況になり、Aliceが全部表にしてしまう。
低い値は何を取らされる?
・Aliceがどうがんばっても、Bobは最もロストの低いカードを選ぶことができるようだ。abs(B - A)が最も小さいカードを選べばいい。

実装

int main() {
  cincout();
  
  ll N;
  cin >> N;
  
  vector<ll> A(N), B(N);
  ll ans = 0;
  ll bigA = 0;
  ll minDif = oo;
  rep(i, N){
    cin >> A[i] >> B[i];
    ans += max(A[i], B[i]);
    if (A[i] > B[i]) ++bigA;
    chmin(minDif, abs(A[i] - B[i]));
  }
  if (bigA % 2 == 0){ // 全部大きい値をとれる
    cout << ans << endl;
    return 0;
  }
  // 1枚だけ、損が少ないカードをとる
  ans -= minDif;
  cout << ans << endl;
}

https://atcoder.jp/contests/arc164/submissions/43425516




いいなと思ったら応援しよう!