![見出し画像](https://assets.st-note.com/production/uploads/images/25462685/rectangle_large_type_2_37395f6fc98995da41ee12995b2f79f4.png?width=1200)
Photo by
ia19200102
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問題の見直しは次回!
この記事が気に入ったらサポートをしてみませんか?