Official
B - チーム編成 / Team Formation Editorial by admin
Qwen3-Coder-480B概要
青木君を必ずチームに含め、残りのメンバーを実力値が高い順に選んだときの、チーム全体の実力値の合計を求めます。
考察
この問題では、まず青木君(選手 \(T\))をチームに必ず入れる必要があります。
その後、残りの \(K - 1\) 人を「青木君以外の選手中から」実力値が高い順に選びます。
素朴な方法としては、全員の実力値をソートして上位 \(K\) 人を選ぶというものがありますが、
そのままだと青木君が選ばれない可能性があるため、工夫が必要です。
そこで、以下の手順を考えます:
- 青木君の実力値を別途保存しておく
- 青木君を候補リストから取り除く
- 残った候補者を実力値の降順にソートする
- 上位 \(K - 1\) 人の実力値の合計に、青木君の実力値を加える
これにより、青木君を確実にチームに入れつつ、他のメンバーも最適に選ぶことができます。
アルゴリズム
- 入力を読み込み、選手の実力値リスト \(A\) を作成する
- 青木君(インデックス \(T - 1\))の実力値を取得し、リスト \(A\) から削除する
- リスト \(A\) を降順にソートする
- ソートされたリストの先頭 \(K - 1\) 個の要素の和を求め、そこに青木君の実力値を加える
- 合計を出力する
計算量
- 時間計算量: \(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 によって生成されました。
posted:
last update: