Cod sursa(job #1504105)

Utilizator issuePop Daniel issue Data 17 octombrie 2015 12:25:48
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <iostream>
#include <fstream>

using namespace std;

#define numarMaximDeSaltele 16002

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

int numarDeSaltele, numarDeTransporturi;
int saltele[numarMaximDeSaltele];

int check(int x) {
    int i, storage = 0, transporturi = 0;
    for(i = 0; i < numarDeSaltele; i++){
        if(storage + saltele[i] < x){
            storage += saltele[i];
        } else{
            storage = 0;
            transporturi++;
        }
    }
    if(transporturi <= numarDeTransporturi) return 1;
    return 0;

}

int main() {
    int i, volMax = 0, sumaVolume = 0;
    fin >> numarDeSaltele >> numarDeTransporturi;
    for(i = 0; i < numarDeSaltele; i++){
        fin >> saltele[i];
        if(saltele[i] > volMax) volMax = saltele[i];
        sumaVolume += saltele[i];
    }
    int sirAux[numarMaximDeSaltele], k = volMax;
    sirAux[sumaVolume - volMax + 1] = sumaVolume;
    for(i = 0; i < sumaVolume - volMax + 1; i++){
        sirAux[i] = k;
        k++;
    }
   // cout<<check(sirAux[7]);
    int stanga = 0, dreapta = sumaVolume - volMax + 1, mijloc;
    while(dreapta - stanga > 1){
        mijloc = (dreapta + stanga) / 2;
       // cout << sirAux[mijloc]  << " ";
        if(check(sirAux[mijloc])){
            dreapta = mijloc;
        } else {
            stanga = mijloc;
        }
    }
    fout << sirAux[mijloc];
    fin.close();
    fout.close();
    return 0;
}