Official

B - カード取りゲーム / Card Taking Game Editorial by physics0523


高橋君は(高橋君の得点) −(青木君の得点)を最大化するように、青木君は(高橋君の得点) −(青木君の得点)を最小化するように、それぞれ最適にプレイします。

両者の得点の最終的な総和は \(A\) の総和となるため、不変です。なので、両者ともに自分の得点を最大化することになります。
両者ともに残っているカードのうち最大のものを取り続けるという戦略が最適となります。
その結果、カードの値の降順(大きなものを先に並べる)に並べた時、 \(1,3,5,\dots\) 枚目を高橋君、 \(2,4,6,\dots\) 枚目を青木君が取ることになります。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;
using ll=long long;

int main(){
  ll N;
  cin >> N;
  vector<ll> A(N);
  for(auto &nx : A){cin >> nx;}
  sort(A.rbegin(),A.rend());

  ll res=0;
  for(ll i=0;i<N;i++){
    if(i%2){res-=A[i];}
    else{res+=A[i];}
  }
  cout << res << "\n";
  return 0;
}

posted:
last update: