Cod sursa(job #1288959)

Utilizator buletevladBulete Vlad buletevlad Data 9 decembrie 2014 11:51:30
Problema Transport Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.37 kb
#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);
    }
}