Cod sursa(job #2109772)

Utilizator razvanradulescuRadulescu Razvan razvanradulescu Data 20 ianuarie 2018 09:43:54
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

long long int n, k, volum[16050];
unsigned long long int lg = 1, suma[16050];

bool transpo(long long int x)
{
    long long int s, i, lg1;
    long long int poz = 0;
    bool ok = 0;
    for(int aux = 0; aux<k; aux++)
    {
        s = x;
        i = 0;
        lg1 = lg;
        for(; lg1!=0; lg1>>=1)
            if(suma[i+lg1]<=suma[n] && suma[i+lg1]-suma[poz]<=s)
                i+=lg1;
        if(i!=n)
        {
            poz = i;
        }
        if(i == n)
        {
            ok = 1;
            break;
        }
    }
    return ok;
}

void log(long long int lg2)
{
    long long int i = suma[n]/k;
    for(; i<suma[n]; i++)
        if(transpo(i) == 1)
        {
            printf("%lld", i);
            return;
        }
}

void rez()
{
    memset(suma, 16050, sizeof(suma));
    suma[0] = 0;
    for(int i = 1; i<=n; i++)
    {
        scanf("%lld\n", &volum[i]);
        suma[i] = suma[i-1]+volum[i];
    }
    while(lg<suma[n])
        lg=(lg<<1);
    log(lg);
}

int main()
{
    freopen("transport.in", "r", stdin);
    freopen("transport.out", "w", stdout);
    scanf("%lld %lld\n", &n, &k);
    rez();
    return 0;
}