公式
A - ロボットバトル大会 / Robot Battle Tournament 解説 by admin
Qwen3-Coder-480B概要
\(N\) 台のロボットがシングルエリミネーション方式のトーナメントで戦うとき、戦闘力が高いロボットが勝ち抜いていく。最初の配置順が与えられたとき、最終的に優勝するロボットの番号を求めよ。
考察
この問題は、トーナメント形式の戦いをシミュレーションするだけの問題です。ロボットは番号 \(1\) から \(N\) まで順に並んでおり、隣り合う2台ずつが戦って強い方が勝ち、次のラウンドに進むという流れを繰り返します。
例えば、\(N=4\) で戦闘力が \([10, 5, 8, 3]\) の場合を考えましょう。ロボット番号はそれぞれ \(1, 2, 3, 4\) です。
1回戦:
- ロボット1 vs ロボット2 → 10 vs 5 → ロボット1が勝つ
- ロボット3 vs ロボット4 → 8 vs 3 → ロボット3が勝つ
2回戦(勝者が順に並ぶ):
- ロボット1 vs ロボット3 → 10 vs 8 → ロボット1が勝つ
よって、優勝するのはロボット1です。
このように、実際にトーナメントをシミュレーションすれば答えが求められます。
ただし、素朴に考えると、毎回新しいリストを作ったり、インデックスの管理を間違えるとバグの原因になります。また、Pythonなどの言語では入力の読み込み方法によってはTLEになることもあります。そのため、効率的な入力処理と、ロボット番号を直接追跡するように実装することが重要です。
アルゴリズム
解法としては、トーナメントをそのままシミュレーションします。
- 最初に、ロボットの番号を管理するリスト
robotsを用意します(初期値は \(1, 2, ..., N\))。 - 各ラウンドで、
robotsを先頭から2つずつ取り出し、それらの戦闘力を比較して勝者を選びます。 - 勝者だけを集めたリストを次のラウンドとして更新します。
- 最終的に1台だけ残ったロボットが優勝者です。
この方法で、トーナメントの構造を忠実に再現できます。
計算量
- 時間計算量: \(O(N)\)
各ラウンドでロボットの数が半分になるため、合計で \(N + N/2 + N/4 + \cdots \approx 2N\) 回の比較が行われる。 - 空間計算量: \(O(N)\)
ロボット番号を保持するリストに最大 \(N\) 個の要素が必要。
実装のポイント
- ロボットの番号は1-indexedなので、配列アクセスの際はインデックスを1引く必要があります(例:
robots[i] - 1)。 - 入力が大きい場合は高速な入力処理(
sys.stdin.readなど)を使用することを検討しましょう。 - 各ラウンドで勝ち残ったロボットを新たなリストに保存し、それを次のラウンドの候補とすることで、トーナメントの進行を簡単にシミュレートできます。
## ソースコード
```python
def main():
import sys
input = sys.stdin.read
data = input().split()
N = int(data[0])
A = list(map(int, data[1:N+1]))
# ロボット番号は1-indexedで管理
robots = list(range(1, N + 1))
while len(robots) > 1:
next_round = []
for i in range(0, len(robots), 2):
left_idx = robots[i] - 1
right_idx = robots[i + 1] - 1
if A[left_idx] > A[right_idx]:
next_round.append(robots[i])
else:
next_round.append(robots[i + 1])
robots = next_round
print(robots[0])
if __name__ == "__main__":
main()
この解説は qwen3-coder-480b によって生成されました。
投稿日時:
最終更新: