見出し画像

[ABC290 Python]Toyota Programming Contest 2023 Spring Qual B(AtCoder Beginner Contest 290)A~D問題Python解説

今回のコンテストはなぜかわからないのですが、
入力例、出力例が少ない問題が多かったように感じます。
テストケースをたくさん作ることの大変さは重々承知していますが、入力例が少ないと初心者の方は解きづらいのではないかと思います。

A問題

https://atcoder.jp/contests/abc290/tasks/abc290_a

N, M = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
ans = 0
for i in range(M):
    ans += A[B[i]-1]
print(ans)

解けた問題×その問題の点数です。
解けた問題はリストBに入っているので、
配点のリストAの中で解けた問題(インデックスなので-1)の分ansに足すことで合計点数を出力できます。

B問題

https://atcoder.jp/contests/abc290/tasks/abc290_b

N, K = map(int, input().split())
S = list(input())
i = 0
T = ""
while K > 0:
    if S[i] == "o":
        T += "o"
        K -= 1
    else:
        T += "x"
    i += 1

T += "x"*(N-len(T))
print(T)

参加したN人は以下の3パターンに分けることができます。
①参加を希望し、参加者がまだ埋まっていない。
②参加を希望したが、参加者が埋まっている。
③参加を希望していない。

参加を希望していない場合は、
参加者K人に達しているか否かは関係なくT[i]はxになります。
ですので、
①→o、②→x、③→x
と整理できます。

このことからK人が埋まるまで
(whileで確認できます。)
参加を希望している場合は、
T += "o"で
希望していない場合は、
T += "x"です。

K人埋まった後は、
希望してるか否かは関係なく
T += "x"
です。

C問題

https://atcoder.jp/contests/abc290/tasks/abc290_c

N, K = map(int, input().split())
A = list(map(int, input().split()))

a = list(set(A))
# print(a)
a.sort()
c = 0
for i in a:
    if c == i:
        c += 1
    else:
        break
# print(c)
print(min(K, c))

AからK要素抜き出したりするとTLEになりますので、
工夫が必要です。

MEXの計算の定義を見てみると、
0~mまでの全て整数が数列に含まれている必要があると書かれているだけで、Kに関しては関わっていません。
つまり、MEXの計算にはKは関与しないということが分かります。
ですので、まずはMEXを計算して最後にKと比べるという方法をとることで、計算量を少なくすることができます。

MEXの計算をしていきます。
数列Aには同じ数字が複数含まれている可能性があるので、
set()でかぶりをなくします。
その後listに直してからsortすることで、
数列Aに含まれる要素について、小さい順に保存することができます。(リストa)

次に、0から順番に見ていき、
リストaに含まれていない数字があれば、その数がMEXの答えです。

最後にMEXの答えとKを比べて、
もしK<MEXであると、K要素選ぶことに反するため、
KとMEXの最小値を出力します。

D問題

https://atcoder.jp/contests/abc290/tasks/abc290_d

後日記載します。

この記事が気に入ったらサポートをしてみませんか?