実際の問題はこちらからご覧ください。
【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)