Pagini recente » Cod sursa (job #389801) | Cod sursa (job #1391507) | Cod sursa (job #2342220) | Cod sursa (job #2228330) | Cod sursa (job #1225371)
#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;
}