ABC384 感想まとめ
トヨタ自動車プログラミングコンテスト2024#12(AtCoder Beginner Contest 384) - AtCoder
2ヶ月半ぶりにRated参加しました。結果はABCまでの3解答で、レーティング微減で茶色に戻っております。
久々に時間が決まっている中で問題を解いてみました。この緊張感はやはり、コンテストに参加しないとわからないものがありますね。
なんか、レーティングを気にするよりは参加回数を増やすほうが良いのかな、最近思い始めています。(イチロー氏は打率より安打数を重要視していた...という思考を真似ている)
A - aaaadaa
文字列 S を一文字ずつチェックして、違ったら置換します。
文字列 S を list にしておくと、楽かもしれません。
N, C1, C2 = input().split()
S = list(input())
for i in range(len(S)):
if S[i] != C1:
S[i] = C2
print("".join(S))
B - ARC Division
条件に従ってチェックしていきます。
N, R = map(int, input().split())
for i in range(N):
D, A = map(int, input().split())
if D == 1 and 1600 <= R <= 2799:
R = R + A
continue
if D == 2 and 1200 <= R <= 2399:
R = R + A
continue
print(R)
C - Perfect Standings
問題 ["A", "B", "C", "D", "E"] 5つから解いた問題のパターンを全探索する必要があります。これは、bit全探索を使いました。
a, b, c, d, e = map(int, input().split())
points = [a, b, c, d, e]
names = ["A", "B", "C", "D", "E"]
point_names = defaultdict(list) # X点取った人の名前をリスト
# bit全探索
for bitnum in range(1, 1<<5):
point = 0 # このbitでの得点
name = [] # このbitでの回答者の名前
for shift in range(5):
# shift bit 桁だけシフトして、1/0判定
if (bitnum>>shift) & 1:
point += points[shift]
name.append(names[shift])
name.sort()
fullname = "".join(name)
point_names[point].append(fullname)
# 点数が高い順に並べる
sorted_keys = sorted(point_names.keys(), reverse=True)
# 点数が高い順にループ
for key in sorted_keys:
# 同点の場合、名前順に並べる
name_list = point_names[key]
name_list.sort()
for name in name_list:
print(name)
D - Repeated Sequence
D問題はコンテスト中には正答できませんでした。
- 1ループの部分の和を求める(sum_a)
- Sをsum_aで割った余り(amari)を求める
- 余りを作れるか、判定
という流れはわかっていたんですけども、[余りを作れるか、判定]の部分を、コンテスト中はうまく実装できなかったのでした。
N, S = map(int, input().split())
A = list(map(int, input().split()))
sum_a = sum(A) # 1ループ内の合計
amari = S % sum_a # ループ外の得点(余り)
A2 = A + A # ループ2回分の配列
accumulate_a = list(itertools.accumulate(A2)) # 累積和
accumulate_a.insert(0, 0)
# A2の中で、余りに一致する部分和があるか検索
for i in range(len(accumulate_a) // 2):
# 区間和 右端(value2)‐左端(value1) == amari になれば良い
value1 = accumulate_a[i]
diff = amari + value1
index = bisect.bisect_left(accumulate_a, diff)
if index < len(accumulate_a):
value2 = accumulate_a[index]
if value2 - value1 == amari:
print("Yes")
exit()
print("No")