【AtCoder】PythonでABC238のB問題を丁寧に読み解く

AtCoder Beginner Contest 238 - Pizza

実際の問題はこちらからご覧ください。

【AtCoder Beginner Contest 238】B – Pizza

この問題のポイント

円周上の角度を扱う方法と、切れ込みが入る位置を追跡するロジックが必要なこと。

実装方法

1. 最初に、入力されたn(数列の長さ)とangles(数列Aの角度)を読み込む。

2. 360度のbool値リストflを作成して、最初の切れ込み(0度)を記録する。

3. 数列Aの各角度に対してforループを実行して、ピザを回転させ、新しい切れ込みの位置をリストflに記録する。

4. forループを終えたら、切れ込み間の最大角度を計算する。これは、リストflを展開して、連続する真の値(切れ込みの間隔)を計測することで求められる。

5. 最終的に、計算された最大中心角を出力する。

Pythonによる解答

このアルゴリズムの計算量は、O(360)

n = int(input())
angles = list(map(int, input().split()))

flags = [False] * 360
flags[0] = True
position = 0

# 角度リストを使ってピザを切る
for angle in angles:
    position = (position + angle) % 360
    flags[position] = True

max_angle = 0
cur = 0

# 最大のピザスライスの角度を計算
for i in range(361):
    if flags[i % 360]:
        max_angle = max(max_angle, cur)
        cur = 0
    cur += 1

print(max_angle)