Cod sursa(job #659048)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 9 ianuarie 2012 22:40:16
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>

using namespace std;

int n, k;
int v[16001];
int sum, max;
int rez;

int binary_search(int left, int right);

bool verif(int drum);

int maxim(int a, int b)
{
    if(a > b)
        return a;
    return b;
}

void citire()
{
    freopen("transport.in", "r", stdin);
    scanf("%d %d\n", &n, &k);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d\n", &v[i]);
        sum += v[i];
        max = maxim(max, v[i]);
    }
    fclose(stdin);
}

int rezolvare()
{
    int from = max;
    int to = sum;
    int mid;
    while(from <= to)
    {
        mid = (from + to) / 2;
        if(verif(mid))
        {
            to = mid - 1;
            rez = mid;
        }
        else
        {
            from = mid + 1;
        }
    }
    return rez;
}

bool verif(int drum)
{
    int drumActual = 1;
    int location = 1;
    int sumaPartial;
    while(drumActual <= k && location <= n)
    {
        sumaPartial = 0;
        while(sumaPartial + v[location] <= drum && location <= n)
        {
            sumaPartial += v[location];
            location++;
        }
        drumActual++;
    }
    if(--location == n)
        return true;
    return false;
}

void afisare()
{
    freopen("transport.out", "w", stdout);
    printf("%d", rezolvare());
    fclose(stdout);
}

int main()
{
    citire();
    afisare();
    return 0;
}