公式

B - チーム編成 / Team Formation 解説 by admin

Qwen3-Coder-480B

概要

青木君を必ずチームに含め、残りのメンバーを実力値が高い順に選んだときの、チーム全体の実力値の合計を求めます。

考察

この問題では、まず青木君(選手 \(T\))をチームに必ず入れる必要があります。
その後、残りの \(K - 1\) 人を「青木君以外の選手中から」実力値が高い順に選びます。

素朴な方法としては、全員の実力値をソートして上位 \(K\) 人を選ぶというものがありますが、
そのままだと青木君が選ばれない可能性があるため、工夫が必要です。

そこで、以下の手順を考えます:

  1. 青木君の実力値を別途保存しておく
  2. 青木君を候補リストから取り除く
  3. 残った候補者を実力値の降順にソートする
  4. 上位 \(K - 1\) 人の実力値の合計に、青木君の実力値を加える

これにより、青木君を確実にチームに入れつつ、他のメンバーも最適に選ぶことができます。

アルゴリズム

  1. 入力を読み込み、選手の実力値リスト \(A\) を作成する
  2. 青木君(インデックス \(T - 1\))の実力値を取得し、リスト \(A\) から削除する
  3. リスト \(A\) を降順にソートする
  4. ソートされたリストの先頭 \(K - 1\) 個の要素の和を求め、そこに青木君の実力値を加える
  5. 合計を出力する

計算量

  • 時間計算量: \(O(N \log N)\)(ソートに支配される)
  • 空間計算量: \(O(N)\)(実力値リストの記憶)

実装のポイント

  • 青木君のインデックスは 0-based ではなく 1-based で与えられるので、リストアクセス時は T - 1 を使うこと
  • pop() を使うことでリストから特定の要素を削除できるが、その後のソートには影響しないようにする
## ソースコード

```python
# 入力の読み込み
N, K, T = map(int, input().split())
A = list(map(int, input().split()))

# 青木君の実力値を取得し、リストから除外
aoki_score = A[T - 1]
A.pop(T - 1)

# 実力値を降順にソート
A.sort(reverse=True)

# 上位 K-1 人の実力値の合計 + 青木君の実力値
total = aoki_score + sum(A[:K - 1])

# 結果の出力
print(total)

この解説は qwen3-coder-480b によって生成されました。

投稿日時:
最終更新: