見出し画像

AtCoder Beginner Contest 167を見直す

全体的な所感

Cでハマったので、D問題は読むこともできなかった。。。私は組み合わせ系の問題がどうも苦手っぽいな。

A - Registration

問題
文字列が入力されるので、2つ目の文字列が1つ目の文字列+1文字になっていたら「Yes」そうでなければ「No」を出力する問題

if input() == input()[0:-1]:
 print("Yes")
else:
 print("No")

冷静に考えると、「[0:-1]」の「0」はいらなかったな。A問題はどうにか安定して回答できるようになってきた気がする。

B - Easy Linear Programming

問題

1が書かれたカードが A枚、0が書かれたカードが B枚、 −1が書かれたカードが C枚あります。これらのカードから、ちょうど K枚を選んで取るとき、取ったカードに書かれた数の和として、 ありうる値の最大値はいくつですか。

ちゃんと考えてもいいけど、力づくで解決してみようと思って回答したのが以下

A, B, C, K = map(int, input().split())
cards = [1 for _ in range(A)]
cards += [0 for _ in range(B)]
cards += [-1 for _ in range(C)]
print(sum(cards[:K]))

結構シンプルにかけてるし、考え方もカードを得点の高い方から並べて、先頭からKの枚数だけ足すというシンプルな回答だったんだけど。
結局ループを3回まわしているので、ほとんどの入力でタイムアウトでした。

それで、ループを利用せずに回答したのが以下

A, B, C, K = map(int, input().split())
if K >= A+B:
   ans = A - (K-A-B)
else:
   ans = K
print(ans)


Kの数が、Aの枚数とBの枚数の合計よりも
大きい場合は、Aの枚数からCの枚数(KからAの枚数とBの枚数の合計を引いた数)を引いた値を出力。
小さい場合は、Kの値を出力

お分かりだろうか、完全にKがA以下だったときのことが考慮されていない。正解は以下

A, B, C, K = map(int, input().split())
if K <= A:
   print(K)
elif K <= A+B:
   print(A)
else:
   print(A-(K-A-B))

B問題までは安定して解けるようになりたい。

C問題の見直しは次回!

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