페이지

2613번: 숫자구슬

https://www.acmicpc.net/problem/2613


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

댓글 3개 :

  1. 블로그 관리자가 댓글을 삭제했습니다.

    답글삭제
  2. 작성자님 질문이 있어서 댓글로 여쭤봅니다.
    배열a의 값을 입력받을때 low값을 가장큰 배열의 수로 초기화하는 이유가 뭔지 잘 모르겠네요.
    다른건 다 이해되는데 if (a[i] > low) low = a[i];
    이부분이 이해가 잘 안됩니다. low값을 0으로 해놓고 하는것과 차이점이 뭔가요..?

    답글삭제
    답글
    1. 입력시 구한 low는 그룹의 합으로 가능한 최솟값을 의미합니다.
      이 값보다 작으면 그룹을 구성할 수 없습니다.

      삭제