Pagini recente » Cod sursa (job #2550435) | Cod sursa (job #1798310) | Cod sursa (job #3270751) | Cod sursa (job #369268) | Cod sursa (job #2083098)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("transport.in");
ofstream fout("transport.out");
int st[16001];
int sol[256032001]; ///16001 * 16001 <-vol maxim total
int verif (int x, int k, int n)
{
///returneaza: -> 0 daca face mai mult de k transporturi
/// cu capacitatea curenta x a camionului
/// -> 1 daca face mai putin de k -------//-------
//x = capacitatea curenta a camionului
//k = nr de drumuri maxime posibile
//n = nr de saltele
int contor=0, i=1, s=0;
//contor = nr de drumuri pe care le face camionul
// cu capacitatea x
//s = suma temporara pt fiecare drum
while ( (contor < k) && (i <= n) )
///cat inca nu am terminat toate saltelele
/// si nu am depasit nr de drumuri
{
s = 0;
while( (s+st[i] <= x) && (i <= n) )
///cat inca incape in camionul de dimensiuni actuale
s += st[i++];
contor++;
}
if( i == n+1 ) ///daca nr de transporturi e mai mic decat k
return 1;
else
return 0;
}
int caut_bin (int st, int dr, int k, int n)
{
if(st < dr)
{
int m = st + (dr - st)/2; //prevent overflow
int temp = verif(m, k, n);
if(temp == 1)
return caut_bin(st, m-1, k, n);
else
if(temp == 0)
return caut_bin(m+1, dr, k, n);
}
return st;
}
int main()
{
int n, k, c;
fin>>n>>k;
int i, vol=0, maxim=0;
// volumul total al saltelelor
// maxim ca sa ne asiguram ca intra in camion macar o saltea
///^cea mai voluminoasa saltea
for(i=1; i<=n; i++)
{
fin>>st[i];
vol += st[i];
if (st[i] > maxim)
maxim = st[i];
}
fout<<caut_bin(maxim, vol, k, n);
}