페이지

1114번: 통나무 자르기

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


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

댓글 없음 :

댓글 쓰기