Cod sursa(job #1024067)

Utilizator stefyvoltFMI Stefan Niculae stefyvolt Data 8 noiembrie 2013 09:25:54
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <iostream>
#include <fstream>
using namespace std;

int v[16001], n, k, i, maxim, total;

int verif(int capacit)                          // verificam daca capacitatea camionului este buna
{
    int drumuri=1, salt_puse=0;

    for(i=1; i<=n; i++)
        if(salt_puse + v[i] <= capacit)         // daca am mai pune o saltea nu se depaseste capcaitatea camionului
            salt_puse += v[i];                  // punem salteaua
        else                                    // daca depaseste capacitatea
        {
            drumuri++;                          // inseamna ca trecem la drumul urmator
            salt_puse=0;                        // resetam numarul saltelelor puse in acest nou camion
            i--;                                // scadem contorul pentru a reevalua salteaua care a depasit capacitatea
        }

    if(drumuri <= k)                            // daca numarul de drumuri este destul de mic
        return 1;                               // inseamna ca am gasit solutia
    return 0;                                   // daca nu, nu este buna solutia
}

int caut_bin(int st, int dr)
{
    if(st > dr)                                 // daca s-a ajuns cu limita stanga mai mare decat cea dreapta
        return st;                              // inseamna ca am gasit capacitatea dorita

    int mij = (st+dr)/2;

    if(verif(mij))                              // daca capacitatea presupusa este satisfacatoare
        return caut_bin(st, mij-1);             // incerca sa gasim o capacitate mai mica, in stanga
    else                                        // daca capacitatea presupusa este prea mica
        return caut_bin(mij+1, dr);             // cautam una mai mare, in dreapta
}

int main()
{
    ifstream f ("transport.in");
    ofstream g ("transport.out");

    f >> n >> k;
    while (f >> v[++i])                         // citim volumele saltelelor din fisier
    {
        maxim = v[i] > maxim? v[i] : maxim;     // cautam maximul
        total += v[i];                          // facem suma
    }

    g << caut_bin(maxim,total);                 // capacitatea dorita se afla intre cea mai mare saltea si suma tuturor saltelelor

    return 0;
}