競技プログラミング

ABC088B – Card Game for Two

https://atcoder.jp/contests/abs/tasks/abc088_b

イントロダクション

AtCoderの問題、「AliceとBobのカードゲーム」をSwiftを使用して解く方法を取り上げます。

問題の詳細説明

N枚のカードがあり、それぞれには異なる数が書かれています。AliceとBobは交互に1枚ずつカードを取り、カードに書かれている数がその人の得点になります。Aliceが先にカードを取ります。これらのルールの下で、どちらのプレーヤーがどう行動すれば得点を最大化できるかが問題です。

問題の要素解説

この問題は、ソートと配列の操作を理解しているかをテストするものです。また、各プレイヤーが自分の得点を最大化する戦略を取ることが前提とされているため、各ターンで可能な選択の中から最善の選択を選び出す「貪欲法」の考え方を適用します。

解答戦略

  1. 標準入力からNと各カードの数値を読み込みます。
  2. 入力した数値を降順にソートします。
  3. AliceとBobが交互に最も大きなカードを取ることを繰り返します。
  4. すべてのカードが取られたら、AliceとBobの得点の差を計算し出力します。

Swiftでの解答コード

Swiftではsortメソッドと配列のスライス機能を用いて実装できます。

以下にコードの全文を示します:

import Foundation

// Read the input
let N = Int(readLine()!)!
let cards = readLine()!.split(separator: " ").map { Int($0)! }

// Sort the cards in descending order
let sortedCards = cards.sorted(by: >)

var aliceScore = 0
var bobScore = 0

for i in 0..<N {
    if i % 2 == 0 {
        // Alice's turn
        aliceScore += sortedCards[i]
    } else {
        // Bob's turn
        bobScore += sortedCards[i]
    }
}

// Print the difference
print(aliceScore - bobScore)

考察と最適化

この問題は貪欲法とSwiftの基本的な配列操作を用いて効率的に解くことができます。入力サイズが大きくなっても、このアプローチは効率的に動作します。

結論

AtCoderの問題に取り組むことで、Swiftの基本的な操作やアルゴリズムの考え方を学ぶことができます。

コメントとフィードバックの募集

読者の皆様からのコメントやフィードバックをお待ちしております。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です