Cod sursa(job #2083098)

Utilizator nic_irinaChitu Irina nic_irina Data 7 decembrie 2017 01:57:03
Problema Transport Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream fin("transport.in");
ofstream fout("transport.out");

int st[16001];
int sol[256032001]; ///16001 * 16001 <-vol maxim total

int verif (int x, int k, int n)
{
    ///returneaza: -> 0 daca face mai mult de k transporturi
    ///                      cu capacitatea curenta x a camionului
    ///            -> 1 daca face mai putin de k -------//-------
    //x = capacitatea curenta a camionului
    //k = nr de drumuri maxime posibile
    //n = nr de saltele
    int contor=0, i=1, s=0;
    //contor = nr de drumuri pe care le face camionul
    //                                       cu capacitatea x
    //s = suma temporara pt fiecare drum
    while ( (contor < k) && (i <= n) )
        ///cat inca nu am terminat toate saltelele
        ///                   si nu am depasit nr de drumuri
    {
        s = 0;
        while( (s+st[i] <= x) && (i <= n) )
            ///cat inca incape in camionul de dimensiuni actuale
            s += st[i++];
        contor++;
    }
    if( i == n+1 ) ///daca nr de transporturi e mai mic decat k
        return 1;
    else
        return 0;
}


int caut_bin (int st, int dr, int k, int n)
{
    if(st < dr)
    {
        int m = st + (dr - st)/2; //prevent overflow
        int temp = verif(m, k, n);
        if(temp == 1)
            return caut_bin(st, m-1, k, n);
        else
            if(temp == 0)
                return caut_bin(m+1, dr, k, n);
    }
    return st;
}

int main()
{
    int n, k, c;
    fin>>n>>k;
    int i, vol=0, maxim=0;
    // volumul total al saltelelor
    // maxim ca sa ne asiguram ca intra in camion macar o saltea
    ///^cea mai voluminoasa saltea
    for(i=1; i<=n; i++)
    {
        fin>>st[i];
        vol += st[i];
        if (st[i] > maxim)
            maxim = st[i];
    }

    fout<<caut_bin(maxim, vol, k, n);
}