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 ABC384 PythonでA〜Dを復習

Posted at

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")
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?