Cod sursa(job #1082254)

Utilizator impulseBagu Alexandru impulse Data 14 ianuarie 2014 13:00:52
Problema Transport Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.16 kb
//
//  main.c
//  transport
//
//  Created by Alexandru Bâgu on 1/14/14.
//  Copyright (c) 2014 Alexandru Bâgu. All rights reserved.
//

#include <stdio.h>
int check(int cap, int *N, int n)
{
    int i, k = 0, c = 0, ck = 0;
    for(i = 0; i < n; i++)
    {
        if(N[i] > cap) return -1;
        c += N[i];
        if(c > cap)
        {
            i--;
            c = 0;
            k++;
        }
    }
    while(c > cap)
        k ++, c -= cap;
    if(c != 0) k ++;
    return k;
}

int main(int argc, const char * argv[])
{
    freopen("transport.in", "r", stdin);
    freopen("transport.out", "w", stdout);
    int n, k;
    scanf("%d%d", &n, &k);
    int *N = (int*)malloc((n+1)* sizeof(int));
    N[n] = 0;
    int i, s;
    int max = 0, min = 16001;
    for(i = 0; i < n; i++)
    {
        scanf("%d", N + i);
        max += N[i];
        if(min > N[i]) min = N[i];
    }
    int f = 0;
    i = 0;
    s = 1 << 30;
    while(s >>= 1 > 0)
    {
        if(i + s < max)
        {
            int res = check(i + s, N, n);
            if(res == -1 || res > k)
                i += s;
        }
    }
    //while(check(i, N, n) > k) i++;
    printf("%d", i + 1);
    return 0;
}