ホーム AtCoder ABC 238 B — Pizza
記事
キャンセル

AtCoder ABC 238 B — Pizza

問題: AtCoder ABC 238 B — Pizza · English · 한국어

最初の切れ目を0°とします。指示ごとに包丁を時計回りに指定された角度だけ回すため、新しい切れ目の位置は直前の位置に回転角を加え、360で割った余りになります。こうして得られるN個の位置と0°を配列に格納します。同じ位置が複数回現れてもそのまま扱います。これは既存の切れ目と重なる切れ目ができ、幅0の間隔が生じることを表します。

位置をソートすると、隣り合う位置の間隔がピザの各部分の大きさになります。最後の切れ目から360°(0°と同じ位置)まで戻る間隔も含めます。これらの間隔の最大値が、最も大きいピザの部分の大きさです。位置は合計N + 1個なので、時間計算量はO(N log N)、空間計算量はO(N)です。

例えば回転角が90, 180, 45, 195なら、切れ目の位置は0, 90, 270, 315, 150です。ソート後は0, 90, 150, 270, 315となり、間隔は90, 60, 120, 45、最後から最初へ戻る間隔は45です。したがって答えは120です。

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(input.readLine().trim());
        StringTokenizer rotations = new StringTokenizer(input.readLine());

        int[] cuts = new int[n + 1];
        int angle = 0;
        for (int i = 1; i <= n; i++) {
            angle = (angle + Integer.parseInt(rotations.nextToken())) % 360;
            cuts[i] = angle;
        }

        Arrays.sort(cuts);

        int largest = 0;
        for (int i = 1; i <= n; i++) {
            largest = Math.max(largest, cuts[i] - cuts[i - 1]);
        }
        largest = Math.max(largest, 360 - cuts[n] + cuts[0]);

        System.out.println(largest);
    }
}
この記事は著者により CC BY 4.0 ライセンスで公開されています。