Cod sursa(job #40180)

Utilizator vmaneavmanea vmanea Data 27 martie 2007 11:51:31
Problema Transport Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.38 kb
//O(N*lgN)

#define nmax 16005
#include <stdio.h>

void bs(int);

int N, K, i, suma, cmax, retinut, nrt, c, maxim, v, ultim, tata;

int V[nmax];

int main(void)
{
    freopen("transport.in", "r", stdin);
    freopen("transport.out","w",stdout);

    scanf("%d%d", &N, &K);

    for (i = 1; i <= N; ++i)
    {
        scanf("%d", &V[i]);
        suma += V[i];

        maxim = V[i] > maxim? V[i]: maxim;
    }

    cmax = v = (suma >> 1);

    ultim = tata = suma;

    // caut binar valoarea optima c
    // daca am gasit un c bun, il memorez

    bs(cmax);

    printf("%d\n", retinut);

    return 0;
}

void bs(int suma)
{
    int m;

    if (suma < maxim)
       nrt = K + 1;
    else
    {
        for (i = 1, nrt = c = 0; i <= N && nrt <= K;) // instabil!
        {
                c += V[i];

                        if (c > suma)
                        {
                            nrt++;
                            c = 0;
                        }
                        else
                            ++i;
        }
        ++nrt;
    }

    v >>= 1;

    if (nrt <= K)
    {
        ultim = retinut  = suma;
        m = (suma + 1) >> 1;
        if (m > 0 && m != suma)
           bs(m);
    }
    else
    {
        // aici
        m = (suma + ultim) >> 1;
        if (m != suma)
           bs(m);
    }
}