【WA4 解説参考に自力実装】C - Variety

振り返り

  • 早い段階からデータを整形すること。標準入力の段階から。
  • 多分配列をマージしてはダメで、取らないといけない色分で、colorfvをループして、その後、N-すでにとった個数で残りの大きい順のものを走査すれば良い。その時はcolorfvにあったものも含めて大きい順番でソートが必要と思われる

コード

# 標準入力の1行目を取得
N, K, M = map(int, input().split())

# 解説を参考
## 個数分+1この[]を配列に入れる。indexを色、価値を配列内の値として登録
jewels = [[] for i in range(N + 1)]

## 個数分ループを回して、2行目以降の標準入力から、jewelsへ適切な色のindexで、価値を数値で配列内に登録
## [[], [30, 40, 50], [10], [20], [], []] のようになる
for i in range(N):
    C, V = map(int, input().split())
    jewels[C].append(V)
  
colorfv = []  
# 取らなければいけない色数分、色の配列から先にとる準備のために、各色の先頭だけの配列に詰める
# 準備するのにcolorfvに抜き出したものは、元の宝石の配列内で印をつける
for i in range(N):
  if (jewels[i]):
    jewels[i].sort(reverse=True)
    colorfv.append(jewels[i][0])
    jewels[i][0]='x'
colorfv.sort(reverse=True)

# 元の宝石の配列を平坦化し、印をつけたものを削除し、大きい順にソート
flatjewels = []
for i in range(len(jewels)):
  for j in range(len(jewels[i])):
    flatjewels.append(jewels[i][j])
flatjewels = [i for i in flatjewels if i != 'x']
flatjewels.sort(reverse=True)

# それぞれの並べた宝石をそのまま合わせて、標準出力
result = []
formatted_j = colorfv+flatjewels
for i in range(K):
  result.append(formatted_j[i])
print(sum(result))