Cod sursa(job #1225371)

Utilizator hasmasandragosHasmasan Dragos hasmasandragos Data 2 septembrie 2014 14:53:21
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
using namespace std;

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

const int nmax=16005;

int sum=0,n,k,a[nmax],maxim=0;

int BSearch (int st,int dr);
int Tura (int x);

int main()
{
    int i; // ok , la aceasta problema o sa cautam binar rezultatul intre 2 numere , stanga fiind cea mai mare saltea , si dreapta fiind volumul total de saltele.
    f>>n>>k; // tot spirul aici ii sa cautam un numar , si sa il verificam . Noi efectiv o sa cautam cat de mare sa fie camionul , si daca se incadreaza in K ture
    for (i=1;i<=n;i++)
    {
        f>>a[i];
        sum+=a[i];
        if (a[i]>maxim) maxim=a[i];
    }
    g<<BSearch(maxim,sum);
    f.close();
    g.close();
    return 0;
}

int BSearch(int st,int dr) // cautam binar incarcatura potrivita
{
    int m,sol;
    while (st<=dr)
    {
        m=(st+dr)/2;
        if (Tura(m))
        {
            sol=m; // ok , la faza asta am fost destul de confuz , de ce nu se poate ca si in dreapta sa primim o solutie , dupaia mi-am dat seama ca ne trebuie dimensiunea MINIMA a camionului , si cum in cautarea binara avem un array crescator , ne uitam doar in stanga;
            dr=m-1;
        }
        else
        st=m+1;
    }
    return sol;
}

int Tura(int x) // functie de verificare cate ture face camionul pt o dimenisune x
{
  int tur=1,load=0;
  for (int i=1;i<=n;i++)
 {
   load+=a[i]; // incarcam cat putem
   if (load>x) // daca salteau nu incape , crestem contirul de ture  si o punem intr-un camion gol.
   {
       load=a[i];
       tur++;
   }
 }
 if (tur<=k)
  return 1;
 return 0;
}