#include<stdio.h> #include<algorithm> int L, K, C, head, tail, m, cnt, ans, a[10010]; bool can(int x) { int i, p = 0, f = 0, t = 0; if (a[x - 1]>m) return 0; for (i = x; i <= K + 1; i++) { if (a[i] - a[i - 1]>m) return 0; if (p + a[i] - a[i - 1]>m) { t++; p = a[i] - a[i - 1]; if (t>C) return 0; } else { p += a[i] - a[i - 1]; } } ans = m; return 1; } int main() { int i; scanf("%d%d%d", &L, &K, &C); for (i = 1; i <= K; i++) { scanf("%d", &a[i]); } a[K + 1] = L; std::sort(a + 1, a + 2 + K); head = 0; tail = L; while (head <= tail) { m = (head + tail) / 2; if (can(1)) { tail = m - 1; } else { head = m + 1; } } m = ans; C--; for (i = 1; i <= K; i++) { if (can(i + 1)) break; } printf("%d %d", ans, a[i]); return 0; }
1114번: 통나무 자르기
https://www.acmicpc.net/problem/1114
피드 구독하기:
댓글
(
Atom
)
댓글 없음 :
댓글 쓰기