Cod sursa(job #860938)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 20 ianuarie 2013 20:37:39
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <fstream>

using namespace std;

//Stiva de saltele, inaltimea ei si numarul maxim de transporturi 
int v[16005],n,k;

//Verificam daca o capacitate data se incadreaza in numarul maxim de saltele
int posibil(int capacitate)
{
   //i este contor, suma calculeaza volumul ocupat din camionul curent,
   //iar necesare vede cate camioane sunt necesare
   int i,suma=0,necesare=1;
   
   //Parcurgem stiva si incarcam camioanele la maxim
   for(i=0;i<n;i++)
   {
      if(suma+v[i]>capacitate)
      {
          suma=v[i];           
          necesare++;           
      }              
      else
      {
          suma+=v[i];    
      }
   }  
   
   //Daca, camioanele fiind incarcate la maxim, numarul lor nu depaseste k
   if(necesare<=k)
      return 1;
   return 0;
   
}

//Determina maximul dintre a si b
int maxim(int a,int b)
{
    if(a>b)
       return a;
    return b;   
}

int main()
{
    //Deschiderea fisierelor de intrare si iesire
    ifstream fin("transport.in");
    ofstream fout("transport.out");
    
    //Cateva variabile locale: st reprezinta suma totala, raspuns contine solutia,
    //cap are inceputul cautarii binare iar i e contor
    int st=0;
    int raspuns=0;
    int cap=-1;
    int i;
    
    //Citirea datelor si calcularea sumei, respectiv a saltelei cele mai mari
    fin>>n;
    fin>>k;
    
    for(i=0;i<n;i++)
    {
        fin>>v[i];
        st+=v[i];
        
        if(v[i]>cap)
           cap=v[i];  //Functia posibil nu va lucra corect daca cautarea binara lucreaza cu saltele
                      //mai mici decat minimul cautarii binare(cap)
    }
    
    //Cautam binar numarul de camioane
    int coada=st;
    int mijl=(st+1)/2;
    
    while(cap<=coada)
    {
         mijl=(cap+coada)/2;   
                   
         if(posibil(mijl)==1)
         {
             //Din ordinea in care apar mijloacele, o solutie este intotdeauna optima
             raspuns=mijl;         
             coada=mijl-1;                   
         }
         else
         {
             cap=mijl+1; 
         }              
    }
    
    //Afisarea raspunsului
    fout<<raspuns<<'\n';
    
    //Inchiderea fisierelor de intrare si iesire
    fin.close();
    fout.close();
    return 0;
}