Cod sursa(job #2805752)

Utilizator icitaVictor Enescu icita Data 21 noiembrie 2021 21:28:15
Problema Transport Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.14 kb
// https://www.infoarena.ro/problema/transport

#include <iostream>
using namespace std;
#include <fstream>

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

int main() {
    
    int nSaltele, volumeSalteleStiva[16001], kMaxTransporturi, capaciateMinCamion=1, volumSaltele = 0, volumMaxSaltea = 0, medieTrasport, centru, limitaStanga, limitaDreapta, volumSalteleRamase, capacitateCamion, capacitateRamasaInCamion, transporturi;
    
    fin >> nSaltele >> kMaxTransporturi;
    
    for (int i=1; i<=nSaltele; i++) {
        
        fin >> volumeSalteleStiva[i];
        if (i==1) {
            volumMaxSaltea = volumeSalteleStiva[1];
        } else {
            if (volumeSalteleStiva[i] > volumMaxSaltea) {
                volumMaxSaltea = volumeSalteleStiva[i];
            }
        }
        volumSaltele = volumSaltele + volumeSalteleStiva[i];
        
    }
    
    if (volumSaltele%kMaxTransporturi == 0) {
        medieTrasport = volumSaltele/kMaxTransporturi;
    } else {
        medieTrasport = volumSaltele/kMaxTransporturi + 1;
    }
    
    if (medieTrasport > volumMaxSaltea) {
        limitaStanga = medieTrasport;
    } else {
        limitaStanga = volumMaxSaltea;
    }
    
    limitaDreapta = volumSaltele;
    
//    while (limitaStanga<=limitaDreapta) {
        
//        centru = (limitaStanga + limitaDreapta) / 2;
        
    volumSalteleRamase = volumSaltele;
    capacitateCamion = limitaStanga;
    
//    while (limitaStanga<=limitaDreapta) {
//
//
//
//    }
    
        for (int t=limitaStanga; t<=limitaDreapta; t++) {
        
            capacitateRamasaInCamion = capacitateCamion;
            volumSalteleRamase = volumSaltele;
            transporturi = 1;
            
            for (int i=1; i<=nSaltele; i++) {
                
//                cout << volumSalteleRamase <<" ";
                int volumSaltea = volumeSalteleStiva[i];
                
                if (capacitateRamasaInCamion >= volumSaltea) {
                    capacitateRamasaInCamion = capacitateRamasaInCamion - volumSaltea;
                    volumSalteleRamase = volumSalteleRamase - volumSaltea;
                } else {
                    capacitateRamasaInCamion = capacitateCamion;
                    transporturi++;
                    
                    if (transporturi > kMaxTransporturi) {
                        break;
                    }
                    
                    if (capacitateRamasaInCamion < volumSaltea) {
                        break;
                    }
                    
                    capacitateRamasaInCamion = capacitateRamasaInCamion - volumSaltea;
                    volumSalteleRamase = volumSalteleRamase - volumSaltea;
                }
        
            }
            
//            cout <<"("<<volumSalteleRamase<< ")\n";
            
            if (volumSalteleRamase <= 0) {
                capaciateMinCamion = capacitateCamion;
                break;
            } else {
                capacitateCamion++;
            }
        
        }
        
        
//    }

    fout << capaciateMinCamion;
    
    cout <<"\n"<<capaciateMinCamion<< "\n";
    return 0;
}