Cod sursa(job #2807675)

Utilizator VanessaCatanetVanessa Elena Catanet VanessaCatanet Data 24 noiembrie 2021 08:27:08
Problema Transport Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.79 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=0, volumSaltele = 0, volumMaxSaltea = 0, medieTrasport, limitaStanga = 1, limitaDreapta, volumSalteleRamase, capacitateCamion, capacitateRamasaInCamion, capacitateRamasaNefolosita = -1, transporturi, capacitateCamionAnterioara = 0;
    
    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;
    
    volumSalteleRamase = volumSaltele;
    capacitateCamion = limitaStanga;
    
    
    while (limitaStanga<=limitaDreapta) {
        
        //        capacitateCamion = limitaStanga;
        
        capacitateCamion = (limitaStanga + limitaDreapta) / 2;
        
        capacitateRamasaInCamion = capacitateCamion;
        volumSalteleRamase = volumSaltele;
        transporturi = 1;
        capacitateRamasaNefolosita = kMaxTransporturi * capacitateCamion;
        
        
        
        for (int i=1; i<=nSaltele; i++) {
            
//            cout << volumSalteleRamase <<" ";
            int volumSaltea = volumeSalteleStiva[i];
            
            if (capacitateRamasaInCamion >= volumSaltea) {
                capacitateRamasaInCamion = capacitateRamasaInCamion - volumSaltea;
                volumSalteleRamase = volumSalteleRamase - volumSaltea;
                capacitateRamasaNefolosita = capacitateRamasaInCamion + (kMaxTransporturi - transporturi) * capacitateCamion;
                
            } else {
                capacitateRamasaInCamion = capacitateCamion;
                transporturi++;
                
                if (transporturi > kMaxTransporturi) {
                    break;
                }
                
                if (capacitateRamasaInCamion < volumSaltea) {
                    break;
                }
                
                capacitateRamasaInCamion = capacitateRamasaInCamion - volumSaltea;
                volumSalteleRamase = volumSalteleRamase - volumSaltea;
                capacitateRamasaNefolosita = capacitateRamasaInCamion + (kMaxTransporturi - transporturi) * capacitateCamion;
            }
            
        }
        
//        cout <<"("<<capacitateCamion<<", "<<capaciateMinCamion<<", "<<volumSalteleRamase<<", "<<transporturi<<", "<<capacitateRamasaInCamion<<", "<<capacitateRamasaNefolosita<<")\n";
        
        if (volumSalteleRamase == 0) {
            
            if (capacitateRamasaNefolosita > 0) {
                if (capacitateCamion==capacitateCamionAnterioara+1) {
                    capaciateMinCamion = capacitateCamion;
                    break;
                }
                capacitateCamionAnterioara = capacitateCamion;
                limitaDreapta = capacitateCamion-1;
                //                capacitateCamion--;
            } else {
                capacitateCamionAnterioara = capacitateCamion;
                capaciateMinCamion = capacitateCamion;
                break;
            }
            
        } else if (volumSalteleRamase > 0) {
            capacitateCamionAnterioara = capacitateCamion;
            limitaStanga = capacitateCamion+1;
            //            capacitateCamion++;
        } else {
            //            volumSalteleRamase < 0
            capacitateCamionAnterioara = capacitateCamion;
            limitaDreapta = capacitateCamion-1;
            //            capacitateCamion--;
        }
        
        //        else {
        //            capacitateCamion++;
        //        }
        
    }
    
    if (capaciateMinCamion == 0) {
        
        if (limitaStanga > limitaDreapta) {
            capaciateMinCamion = limitaStanga;
        } else {
            capaciateMinCamion = limitaDreapta;
        }
        
    }
    
    fout << capaciateMinCamion;
//    cout <<"\n"<<capaciateMinCamion<< "\n";
    
    return 0;
}