概要
今回はABC306(2023年6月17日21:00~22:40)の問題ごとのポイントと自分の実装、およびリアタイしたときの自分の感想について述べていきたいと思う。
A問題
ポイント
- 入力をリストで受け取り、文字を繰り返すように新しい文字列に追加
自分の実装
ABC_306_A.py
N = int(input())
S = input()
S_new = ''
for i in S:
S_new += i
S_new += i
print(S_new)
B問題
ポイント
- 問題文の通りにAの10進法表記を計算
- 桁数がズレないように注意
自分の実装
ABC_306_B.py
A = list(map(int, input().split()))
sum_A = 0
for i in range(len(A)):
sum_A += A[i] * 2 ** i
print(sum_A)
C問題
ポイント
- 数列A中に出てくる数字は決まっているので、各数字についてどの順番で出ているかを記録
- 各数字に対して、
[数字自体, その数字の中で真ん中となるインデックス]
の情報を格納 - インデックスの順番で昇順となるようにソート
- 元の数字を記録し、出力
自分の実装
ABC_306_C.py
N = int(input())
A = list(map(int, input().split()))
indices = [[i] for i in range(N+1)]
# 数列Aのi番目の数字の番号に対応する列に格納
for i in range(3*N):
indices[A[i]].append(i+1)
f = []
for ith_index in indices[1:N+1]:
f.append([ith_index[0], ith_index[2]])
# f(i) となるもののインデックスの順番にソート
f = sorted(f, key=lambda x:x[1])
ans = []
for f_i in f:
ans.append(f_i[0])
print(*ans)
D問題
ポイント
- i番目の料理が出てきた際に、高橋くんがお腹を壊している・いない状態となる時にそれまで食べた料理のおいしさの総和が最大をDPで計算
- i番目の料理が解毒剤入りか毒入りかどうかで場合分けを行う
自分の実装
ABC_306_D.py
N = int(input())
# X:毒入りかどうか 0:解毒剤入り、1:毒入り
# Y:料理のおいしさ
X, Y = [], []
# i回目の料理を食べるかどうか判断する際に
# dp[i][0]:お腹を壊していない時のおいしさの合計の最大値
# dp[i][1]:お腹を壊している時のおいしさの合計の最大値
dp = [[0, 0] for i in range(N+1)]
for i in range(1,N+1):
X_i, Y_i = map(int, input().split())
if X_i == 0:
dp[i][0] = max(max(dp[i-1][0]+Y_i, dp[i-1][0]), dp[i-1][1]+Y_i)
dp[i][1] = dp[i-1][1]
else:
dp[i][0] = dp[i-1][0]
dp[i][1] = max(dp[i-1][0] + Y_i, dp[i-1][1])
print(max(dp[N]))
感想
今回は、自分にしてはスムーズに進められたと思う。D問題までWA
やTLE
を出すことなく35分ほどで解くことができた。その後、E問題が解けずにずっと悩んでいたのだが、その間にジャッジが滞っていたのだと思う。Unrated
となってしまったのは、残念であるが今後も頑張りたいと思う。ただ、最近このようなことが多いので、他のサイトを利用しようかとも思っている。特に、外資系のコーディングテスト対策になるらしいLeetCode
に注目している。