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; }