Pagini recente » Istoria paginii runda/dimi_nu_stie_sa_ciclu_in_graf/clasament | Istoria paginii utilizator/aiexpetrescu | Cod sursa (job #1083492) | Cod sursa (job #967059) | Cod sursa (job #2807675)
// 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;
}