0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

問題

問題文

$N$ 枚のカードがあります. $i$ 枚目のカードには, $a_i$ という数が書かれています.
Alice と Bob は, これらのカードを使ってゲームを行います. ゲームでは, Alice と Bob が交互に 1 枚ずつカードを取っていきます. Alice が先にカードを取ります.
2 人がすべてのカードを取ったときゲームは終了し, 取ったカードの数の合計がその人の得点になります. 2 人とも自分の得点を最大化するように最適な戦略を取った時, Alice は Bob より何点多く取るか求めてください.

制約

・$N$ は $1$ 以上 $100$ 以下の整数
・$a_i~(1 \le i \le N)$ は $1$ 以上 $100$ 以下の整数

収録されている問題セット

回答

回答1 (AC)

このゲームでは、自分が取ったカードの数の合計が自分の得点になるので、「最適な戦略」のもとでは、Alice も Bob もその時の場にある最大の値が書かれたカードを取ります。カードの値を配列 a() で受け取った後、これを大きい順 (降順) にソートすると、0 番目のカードは Alice、1 番目のカードは Bob、2番目のカードは Alice、3番目のカードは Bob ...が取ることになるので、それぞれの得点の合計を計算し、最後にその差を出力すれば良いでしょう。コードは以下のようになりました。

abc088b-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int n;
  cin >> n;

  vector<int> a(n);
  for ( int i=0; i<n; i++ ) {
    cin >> a.at(i);
  }

  sort( a.rbegin(), a.rend() );

  int ascore = 0, bscore = 0;
  for ( int i=0; i<n; i++ ) {
    if ( i%2==0 ) {
      ascore += a.at(i);
    } else {
      bscore += a.at(i);
    }
  }
  cout << ascore-bscore << endl;
}

調べたこと

AtCoder の解説ユーザ解説

回答と同じ方針でした。

AtCoder の解説コンテスト全体の解説

こちらも回答と同じ方針でした。

リンク

前後の記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?