Cod sursa(job #2807674)

Utilizator VanessaCatanetVanessa Elena Catanet VanessaCatanet Data 24 noiembrie 2021 08:24:01
Problema Transport Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.51 kb
#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;

    //    capacitateCamion = 20;
//    limitaStanga = 1;

    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;