ABC397感想
D問題のインパクトがすごい。
A問題
平熱、発熱、高熱を判定するプログラムを作成しろってだけの問題です。
まあただ数値を判定すればいいんですが、小数なので型がfloatであることには気をつけましょう。(一敗)
ちなみに特に10倍にする意味はありません。あんまりfloatを使ったことが無いので不安でこうしましたが、型違いによる判定不可とかになりかねない行為なので、気を付けていきたいです。
print(3 if (x := float(input()) * 10) < 375 else 2 if x < 380 else 1)
B問題
入出の数を合わせろって問題です。
色々やりようはあると思いますが、素直に前から見ていき、
1. 1文字目がoなら修正数+1
2. 2文字目がiなら修正数+1
3. リストの前2文字がi, oであれば、リストを2文字、そうではないなら1文字抜く
とやるのがシンプルだと思います。
後は最後の文字がiだった場合追加で修正+1を入れたり、前から抜いていくのでリストではなくqueueを使用したり、ちょっとした調整をしているくらいです。
import sys
import collections as cs
l = cs.deque(sys.stdin.readline())
ans = 0
while l:
p = l.popleft()
if p == "i":
if not l:
ans += 1
elif l[0] == "o":
l.popleft()
else:
ans += 1
if p == "o":
ans += 1
print(ans)
C問題
左右の種類数の和を最大化しろって問題です。
と言っても、仕切りを前後に動かすしかないので、シンプルに前から見ていけばいいと思います。
確認をとっていませんが、流石に一々種類数を数えると間に合わなくなるので一工夫必要ですが、左は入ってきた数字が初めての数字かを確認し、右は抜けた数字が最後の一個であるかを確認すればいいだけです。
左はset、右は辞書型で管理すれば問題ないでしょう。
ちなみに私は左は辞書型で管理しました。お好みで調整してください。
import sys
import collections as cs
N = int(sys.stdin.readline())
l = cs.deque(map(int, sys.stdin.readline().split()))
right_dict = {}
for i in l:
if i not in right_dict.keys():
right_dict[i] = 1
else:
right_dict[i] += 1
left_dict = {}
left_piece, right_piece = 0, len(right_dict.keys())
ans = 0
while l:
i = l.popleft()
right_dict[i] -= 1
if right_dict[i] == 0:
right_piece -= 1
if i not in left_dict.keys():
left_dict[i] = 1
left_piece += 1
ans = max(ans, left_piece + right_piece)
print(ans)