Atcoder ABC 303解く
20230527 Atcoder ABC contest 303
A問題
意外と時間かかった3回WA出してもうた
最初はandとifの多用で強引に通そうとしたけどandの仕様がよくわからず断念結局2次元配列で管理して not in で判定するのが一番わかりやすかった。
N = int(input())
S = str(input())
T = str(input())
ans = [["0", "o"], ["o", "0"], ["l", "1"], ["1", "l"]]
flg = 1
for n in range(N):
if S[n] != T[n]:
if [S[n], T[n]] not in ans:
flg = 0
if flg:
print("Yes")
else:
print("No")
B問題
珍しく一発でAC
平方行列を作って隣り合っている同士のところを0→1に変換して最終的に0の数を数えて2で割る
N, M = map(int,input().split())
S = []
for _ in range(N):
S.append([0 for i in range(N)])
for n in range(N):
S[n][n] = 1
A = []
for _ in range(M):
# A.append(list(input().split()))
a = list(map(int,input().split()))
for i in range(N - 1):
y = a[i] - 1
x = a[i + 1] - 1
S[y][x] = 1
S[x][y] = 1
cnt = 0
for n in S:
for i in n:
if i == 0:
cnt += 1
print(cnt // 2)
C問題
提出したコード↓:TLEでタイムアウト
N, M, H, K = map(int, input().split())
S = input()
item = []
for i in range(M):
item.append(list(map(int,input().split(" "))))
cnt = 0
flg = 1
x, y = 0, 0
while cnt < N:
H -= 1
if H < 0:
flg = 0
print("No")
break
if S[cnt] == "R":
x += 1
elif S[cnt] == "L":
x -= 1
elif S[cnt] == "U":
y += 1
elif S[cnt] == "D":
y -= 1
cnt += 1
if [x, y] in item and H < K:
H = K
item.remove([x, y])
if flg:
print("Yes")
・tupleはイミュータブルだが少し早い。setは集合演算ができる
・while文でなく、orderでfor文を回す
・itemのアクセス時にX^2を使ってたのかも?pythonの良くないところ出た
・breakでなくexit()でコードを突破できる
・動かし方を辞書型とタプルで表現するとわかりやすい
↓TLEにならない
# setは集合演算(.union/.intersection)が使える
# tupleはlistに比べてイミュータブルである代わりに少し早い
item = set([tuple(map(int, input().split())) for _ in range(M)])
move = {"R":(1,0), "L":(-1, 0), "U":(0,1), "D":(0,-1)}
now = [0, 0]
for order in S:
walk = move[order]
H -= 1
if H < 0:
print("No")
exit()
now[0] += walk[0]
now[1] += walk[1]
if tuple(now) in item and H < K:
H = K
item.remove(tuple(now))
print("Yes")
D問題
むりぽ。全探索でTLEになりそうということだけわかる。動的計画法を使うらしい
なるほど。ダイクストラ法みたいな感じだ。無理
この記事が気に入ったらサポートをしてみませんか?