0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?