#include<cstdio> int a[300], n, m; bool f(int l) { int s = 0, c = 1; for (int i = 0; i < n; i++) { s += a[i]; if (s > l) s = a[i], c++; } return c <= m; } int main() { scanf("%d%d", &n, &m); int low = 0, up = 30000, mid; for (int i = 0; i < n; i++) { scanf("%d", a + i); if (a[i] > low) low = a[i]; } while (low <= up) { mid = (low + up) / 2; f(mid) ? up = mid - 1 : low = mid + 1; } printf("%d\n", low); int i = 0, s = 0, t = 0; for (; i < n; i++) { s += a[i]; if (s > low) { s = a[i]; m--; printf("%d ", t); t = 0; } t++; if (n - i == m) break; } while (m--) printf("%d ", t), t = 1; return 0; }
2613번: 숫자구슬
https://www.acmicpc.net/problem/2613
피드 구독하기:
댓글
(
Atom
)
블로그 관리자가 댓글을 삭제했습니다.
답글삭제작성자님 질문이 있어서 댓글로 여쭤봅니다.
답글삭제배열a의 값을 입력받을때 low값을 가장큰 배열의 수로 초기화하는 이유가 뭔지 잘 모르겠네요.
다른건 다 이해되는데 if (a[i] > low) low = a[i];
이부분이 이해가 잘 안됩니다. low값을 0으로 해놓고 하는것과 차이점이 뭔가요..?
입력시 구한 low는 그룹의 합으로 가능한 최솟값을 의미합니다.
삭제이 값보다 작으면 그룹을 구성할 수 없습니다.