[ABC426] ABC 426(Atcoder Beginner Contest)のA~C(A,B,C)問題をPythonで解説(復習)
合計回答時間:60分
A問題
自分の回答
かかった時間:5分
X,Y = input().split()
# indexがどちらが先か調べる
os = ["Ocelot", "Serval", "Lynx"]
x_index = 0
y_index = 0
for i in range(3):
if X == os[i]:
x_index = i
if Y == os[i]:
y_index = i
if x_index >= y_index:
print('Yes')
else:
print('No')
終了後考えた最適な回答
x, y = input().split()
ver = {"Ocelot":0,"Serval":1,"Lynx":2}
for i in ver:
if x == i:
x = ver[i]
if y == i:
y = ver[i]
print("Yes" if x >= y else "No")
B問題
自分の回答
かかった時間:10分
# Sは長さ3以上、英小文字
S = list(input())
dic = {}
for i in range(len(S)):
if S[i] not in dic:
dic[S[i]] = 1
else:
dic[S[i]] += 1
for k,v in dic.items():
if v == 1:
print(k)
終了後考えた最適な回答
S = input()
S_s = sorted(S)
print(S_s[-1] if S_s[0] == S_s[1] else S_s[0])
C問題
自分の回答
かかった時間:45分
# OSのバージョンはN個ある
# PCもN台、2番目のPCのOSバージョンは2
# おそらく普通に実装するとTLEになる
# まずはTLEになってもいいから実装をする
# 普通の実装完了した
# O(Q)×O(N) = 10^11でTLE
# ①バージョンが2以下のPCを探す
# ②バージョンが2以下ならカウントに追加
# ③2以下のPCを6にアップグレード
# minという変数を作り、そこに3を入れる
N,Q = map(int,input().split())
# PCのバージョンの初期状態
PC = {}
for i in range(N):
PC[i+1] = 1
min = 1
for i in range(Q):
X,Y = map(int,input().split())
# 2 6の場合、バージョン2以下のPCをバージョン6にする
# PCのキーがminからXの値の合計を出力する
# 累積和で実装すればいけるのだろうか?
sum = 0
for i in range(min,X+1):
sum += PC[i]
PC[i] = 0
# sum = sum(map(PC.get, range(min,X+1)))
print(sum)
min = X
PC[Y] += sum
終了後考えた最適な回答
# OSのバージョンはN個ある
# PCもN台、2番目のPCのOSバージョンは2
# おそらく普通に実装するとTLEになる
# まずはTLEになってもいいから実装をする
# 普通の実装完了した
# O(Q)×O(N) = 10^11でTLE
# ①バージョンが2以下のPCを探す
# ②バージョンが2以下ならカウントに追加
# ③2以下のPCを6にアップグレード
# minという変数を作り、そこに3を入れる
N,Q = map(int,input().split())
# PCのバージョンの初期状態
# PC = {}
# for i in range(N):
# PC[i+1] = 1
PC = [1 for i in range(N)]
min = 0
for i in range(Q):
X,Y = map(int,input().split())
# 2 6の場合、バージョン2以下のPCをバージョン6にする
# PCのキーがminからXの値の合計を出力する
# 累積和で実装すればいけるのだろうか?
sum = 0
for j in range(min,X):
sum += PC[j]
PC[j] = 0
if sum > 0:
min = X
# sum = sum(map(PC.get, range(min,X+1)))
print(sum)
PC[Y-1] += sum
次に向けてやること
・二重for文を改善する問題を解く
感想
C問題もうちょっとで解けた、考え方自体はあっていた。for文の二重ループを改善する問題は多数出るので確実に解けるようにしたい