Cod sursa(job #2004048)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 24 iulie 2017 19:41:42
Problema Transport Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int st[16001], n, nrDrum;//date de intrare
int capMin, capMax;//capacitatea minima este val maxima din stiva
//capacitatea maxima este suma

void citire(){
  in >> n >> nrDrum;
  for(int i = 1; i <= n; i++){
    in >> st[i];
    if(st[i] > capMin){
      capMin = st[i];
    }
    capMax += st[i];
  }
}

int nrTransporturi(int capacitate){
  int nrTrans = 0, unTrans ;
  int vf = n;
  unTrans = st[vf];
  vf--;
  while(vf != 0){
    if(unTrans + st[vf] > capacitate){
      nrTrans++;
      unTrans = st[vf];//incep transport nou
      }
    else{
      unTrans += st[vf];
    }
    vf --;
  }
  nrTrans++;
  return nrTrans;
}

int sol = 0;

void cautareBinara(int st, int dr){
  if(st <= dr && st >= capMin && dr <= capMax){
    int mij = (st + dr) / 2;
    int var = nrTransporturi(mij);
    if(var < nrDrum){//capacitate prea mare, ma duc in st
      dr = mij - 1;
    }
    else if(var > nrDrum){//capacitate prea mica, ma duc in dr
      st = mij + 1;
    }
    else if(var == nrDrum){//capacitate egala, verific pt nr-le din st, daca mai sunt
      sol = mij;
      dr = mij - 1;
    }
    cautareBinara(st, dr);
  }
}

void afisare(){
  if(nrTransporturi(1) == nrDrum){
    sol = 1;
  }
  else {
    cautareBinara(capMin, capMax);
  }
  out << sol;
}

int main(){
  citire();
  afisare();
  return 0;
}