ABC307
こんにちは。
仕方ないこととはいえ、調子よかった先週がunratedで結構つらいですが、引き続き頑張りましょう。
今回はABC307( https://atcoder.jp/contests/abc307 )。相も変わらずサーバーは大きな負担がかかってるみたいですね。。。
A
数値が7Nで与えられるので7つごとに区切ってそれぞれの和を出す。スライス使って対処した。
N = int(input())
l = list(map(int, input().split()))
ans = []
for i in range(N):
ans.append(sum(l[i*7:(i+1)*7]))
for a in ans:
print(a, end=" ")
B
2つの文字列をつなげて回文かを判定する。スマートな方法が思いつかず、与えられる文字列が100個までということで、全探索で進めた。
N = int(input())
l = []
ans = "No"
for i in range(N):
l.append(input())
for a in l:
for b in l:
if a == b:
continue
s = a + b
flg = True
for i in range(len(s)//2):
if s[i] != s[-1-i]:
flg = False
break
if flg:
ans = "Yes"
break
print(ans)
C
黒マスと透明マスを持つ2つのシートを組み合わせ、正解シートを作れるかの判定問題。各シートの黒マスの位置関係が分かるような配列を作り、2つのシートの配列を組み合わせて正解シートの配列と一致するかを判定させた。が、なぜか不正解。未だにその原因が解消せず、ACには至ってないがコードを一応残しておく。waだした2つのデータ見せてくれ
#各シートの黒マスの座標を配列で取得
H_a, W_a = map(int, input().split())
l_a = []
for i in range(H_a):
s = input()
for j in range(W_a):
if s[j] == "#":
l_a.append(i*1000 + j)#1の位にx座標、1000の位にy座標う
H_b, W_b = map(int, input().split())
l_b = []
for i in range(H_b):
s = input()
for j in range(W_b):
if s[j] == "#":
l_b.append(i*1000 + j)
H_x, W_x = map(int, input().split())
l_x = []
for i in range(H_x):
s = input()
for j in range(W_x):
if s[j] == "#":
l_x.append(i*1000 + j)
ans = "No"
for i in range(len(l_x)):
adv = l_x[i]#シートAの左上の地点を正解シートのどこの部分とみなすか
black = [adv]#シートAで埋めることができる正解シートの黒マス部分
flg = True
for j in range(1,len(l_a)):
#l_a[j] - l_a[0]でシートAの左上の黒マスと他の黒マスとの位置関係を表し、
#advを加えて正解シートの座標の比較を可能にした。
if l_a[j] + adv - l_a[0] in l_x:
black.append(l_a[j] + adv - l_a[0])
continue
else:
flg = False
break
if flg:#シートAのすべての黒マスが正解シートの黒マスと一致した場合
flg_b = True
#シートBでも同様の処理
for k in range(len(l_x)):
adv_b = l_x[k]
black_b = []
#最終的にAとBの黒マスリストをまとめて正解シートと比較する
#そのため、同じ座標を取らないための条件文
if adv_b not in black:
black_b.append(adv_b)
for j in range(1, len(l_b)):
if l_b[j] + adv_b - l_b[0] in l_x:
if l_b[j] + adv_b - l_b[0] in black:#同じ座標を取らないための条件文
continue
else:
black_b.append(l_b[j] + adv_b - l_b[0])
continue
else:
flg_b = False
break
black_all = black + black_b
black_all.sort()
if black_all == l_x and flg_b:
ans = "Yes"
break
if len(ans) == 3:
break
print(ans)
原因が気になりすぎる。
D
文字列から"("")"で囲まれた部分と"("")"自身を削除していき、最終的に残った文字列を表示する。"("の位置を配列で保持し、")"が現れた場合、配列内の末尾の座標から現在座標までを順々削除していく。"("もなくなるため、末尾から取得する際、popなどを用いて末尾の値は削除しておく。また、sの長さは変化していくため、for文ではなくwhile文で対処。
N = int(input())
s = input()
l_left = []
i = 0
while i < len(s):
if s[i] == "(":
l_left.append(i)
if s[i] == ")" and len(l_left) != 0:
pre = l_left.pop(-1)
s = s[:pre] + s[i+1:]
i = pre - 1
i += 1
print(s)
反省・感想
Cに苦しめられた回でした。Dのほうが簡単な問題であったため、早い段階で見切りをつけてDを取り組むべきでした。WA2つだったので行けると思ってしまいました。。。コード量も結構多めだったので時間取られましたね。 ぶっちゃけEよりも正解者数少ないのは異常事態では。 未だにC解決していないので、気になって眠れませんね。もしわかる方いたらご教授願いたいところです。
Eに関してはまだ取り組めていないので、時間とやる気の余裕次第で確認してみたいです。
次回も頑張りましょう。
現在レート:728 → 732