0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AtCoder ABC370 振り返り感想戦(ほぼ緑コーダーがPythonでA〜C問題まで)

Posted at

ABC370 感想まとめ

トヨタ自動車プログラミングコンテスト2024#9(AtCoder Beginner Contest 370) - AtCoder

ABCまで3解答でした。パフォーマンス831でレーティングは776 (+7)になりました。

前回の復習(AtCoder ABC369 振り返り感想戦)はお試しでSwiftを使いましたけども、今回は準備期間がなく、いつものPythonで参加でした。

今回は昼間に日本酒を結構飲んでおり、若干アルコールが残る中での参加でしたが、まあまあの成績が取れてよかったです。(以前同じことをして、成績が悪かったので決して勧められるものではない...)

万全であれば、D問題をもう少し頑張れた気がするので、SortedSetなどを復習して次回以降に備えたいと思います。

A - Raise Both Hands

if文で判定しました。

L, R = map(int, input().split())
if L == 1 and R == 0:
    print("Yes")
elif L == 0 and R == 1:
    print("No")
else:
    print("Invalid")

B - Binary Alchemy

変換用の2次元配列を作って、変換していきました。

N = int(input())

# 変換用の2次元配列Aを作成する
A = [[0] * (N + 10) for _ in range(N + 10)]
for i in range(N):
    line = list(map(int, input().split()))
    for j in range(len(line)):
        A[i+1][j+1] = line[j]

# 配列Aを利用して、元素を合成していく
genso = 1
for g in range(1, N+1):
    genso1 = genso
    genso2 = g
    if genso1 >= genso2:
        genso = A[genso1][genso2]
    else:
        genso = A[genso2][genso1]

print(genso)

C - Word Ladder

以下の手順で求めました。

  • 手順1:文字列の最初→最後まで走査して、辞書順で先になる文字(E→Aとか)のみを変換する
  • 手順2:文字列の最後→最初まで走査して、辞書順で後になる文字(A→Eとか)のみを変換する

これで、置換文字列を辞書順に求められます。

早ときは苦手なのですが、この問題は解法がすっと浮かんで、自分としては早く解答できたと思います。

S = input()
T = input()

# アルファベットのリスト["a","b","c", .... ,"z"]
alphabet = list(string.ascii_lowercase)

# S, T を一文字づつ比較し、フラグを求める
# 0=一致, -1=辞書順で早い, 1=辞書順で遅い
flag = [0] * len(S)
for i in range(len(S)):
    if S[i] == T[i]:
        continue
    s = alphabet.index(S[i])
    t = alphabet.index(T[i])
    if s < t:
        flag[i] = 1
    else:
        flag[i] = -1
X = []

# 手順1:先頭から走査して、辞書順が早くなる文字を置換
for i in range(len(S)):
    if flag[i] == 0:
        continue
    if flag[i] == -1:
        S = S[:i] + T[i] + S[i + 1:]
        X.append(S)

# 手順2:末尾から走査して、辞書順が遅くなる文字を置換
for i in range(len(S) - 1, -1, -1):
    if flag[i] == 0:
        continue
    if flag[i] == 1:
        S = S[:i] + T[i] + S[i + 1:]
        X.append(S)

print(len(X))
for x in X:
    print(x)

公式解説のように、「とりあえず置換できる箇所を全部置換してみて、辞書順の先頭を求める」という方法もありですね。

D - Cross Explosion

普通にやったらTLEなので、2分探索で爆発により壊される壁を求めるというのはわかった。
壁のある無しの状態をフェニック木で管理しようとして、実装が面倒なことになり完成できず...。
公式解説によれば、壁情報はSortedSetで管理すると良いらしい。なるほど。

0
0
0

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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?