公式
B - 宝石の分配 / Distribution of Jewels 解説 by admin
Qwen3-Coder-480B概要
高橋君と青木君がベルトコンベアから流れる宝石を分配するゲームの結果を判定する問題です。
考察
この問題では、高橋君は自分がこれまで取った宝石の価値の合計が \(K\) 以下である限り、新しい宝石は必ず取り続けます。\(K\) を超えるとそこで取りやめとなり、それ以降の宝石はすべて青木君が受け取ります。
重要な観察は、「高橋君が宝石を取るかどうか」が逐次的に決まっていくことであり、かつそれが合計値が \(K\) を超えるかどうかという単純な条件で決まるということです。
この貪欲的な振る舞いにより、シミュレーションは一回のループで完了します。つまり、各宝石に対して「高橋君が取るか、青木君が取るか」を順番に決定していけばよいので、ソートや再帰など複雑な処理は必要ありません。
素朴なアプローチで誤解を生むことは少ないですが、もし仮に「全部試す」などの方法を取ると、\(N\) が最大 \(2 \times 10^5\) なので、間に合いません(TLE)。しかし、この問題では貪欲法で最適な行動が定まっているため、シンプルなシミュレーションで十分です。
アルゴリズム
- 入力から宝石の数 \(N\) と上限値 \(K\)、そして各宝石の価値 \(A_i\) を受け取る。
- 高橋君の取得した宝石の合計
takahashi_sumと、青木君の合計aoki_sumを初期化する(ともに0)。 - 各宝石 \(A_i\) に対して以下を行う:
- もし
takahashi_sum + A_i <= Kなら、高橋君がその宝石を取る(takahashi_sumに加算)。 - そうでない場合、青木君がその宝石を取る(
aoki_sumに加算)。
- もし
- 最後に両者の合計を比較し、どちらが多いか、または引き分けかを判定して出力する。
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(1)\) (入力を除く)
実装のポイント
- 入力を受け取る際に
map(int, input().split())を使うと効率的です。 - 条件分岐は「高橋君が取れるか?」だけを見ればよいので、
if文一つで処理できます。 - 最後の比較は等号も忘れずに確認しましょう(引き分けの場合に対応)。
## ソースコード
```python
N, K = map(int, input().split())
A = list(map(int, input().split()))
takahashi_sum = 0
aoki_sum = 0
for a in A:
if takahashi_sum + a <= K:
takahashi_sum += a
else:
aoki_sum += a
if takahashi_sum > aoki_sum:
print("Takahashi")
elif aoki_sum > takahashi_sum:
print("Aoki")
else:
print("Draw")
この解説は qwen3-coder-480b によって生成されました。
投稿日時:
最終更新: