バイトの競プロメモ

主に競技プログラミング

C - Time Gap CODE FESTIVAL 2017 Final (Parallel)

問題概略
N+1人の参加者がいて、そのうちの一人とその他の時差が渡される。
片方の都市が0時の時、その値はmin(d,24-d)となる
1<=N<=50
0<=D<=12

解法
答えは0~12なので全部試した。
基準の時刻を0として、その他の時刻をdiとしソートした。
左から順に見ていき、間がt秒未満なら右のものを24-diに置き換える貪欲で通した。証明失敗

想定解の円状でみることで、頂点からの差だということがわかりやすい方法いいなと思った。
確かに左右に振り分けるのが最善になる。

public static void solve() throws Exception {
        //longを忘れるなオーバーフローするぞ
        N = ni();
        A = nia(N);
        sort(A);
        for (int i = 24; i >= 0; i--) {
            if (check(i)) {
                System.out.println(i);
                return;
            }
        }
    }

    public static boolean check(int v) {
        ArrayList<Integer> B = new ArrayList<>();
        B.add(0);
        for (int i = 0; i < N; i++) {
            B.add(A[i]);
        }
        for (int i = 0; i < N; i++) {
            int diff = B.get(i + 1) - B.get(i);
            if (diff < v) {
                if (B.get(i) == 0) return false;
                if (B.get(i + 1) < 12) {
                    B.add(24 - B.get(i + 1));
                    B.remove(i + 1);
                    i--;
                    Collections.sort(B);
                } else {
                    return false;
                }
            }
        }
        return true;
    }