Pagini recente » Cod sursa (job #1665150) | Cod sursa (job #114842) | Cod sursa (job #2647178) | Cod sursa (job #2458440) | Cod sursa (job #1045048)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("transport.in");
ofstream out("transport.out");
int saltele[16000], nr_saltele = 0, max_drumuri = 0;
int check_value(int value)
{
int incarcatura_curenta = 0, drumuri_curente = 0, i;
for(i = 0; i < nr_saltele; i++)
{
if(value < saltele[i])
{
return 0;
}
incarcatura_curenta+= saltele[i];
if(incarcatura_curenta >= value)
{
if(incarcatura_curenta > value)
incarcatura_curenta = saltele[i];
else
incarcatura_curenta = 0;
drumuri_curente++;
}
if(i == nr_saltele -1)
if(incarcatura_curenta > 0)
drumuri_curente++;
}
if(drumuri_curente == max_drumuri) return 0;
else if (drumuri_curente < max_drumuri) return -1;
else return 1;
}
int gaseste(int a, int b)
{
int rezultat;
if(a == b)
return a;
rezultat = check_value((a+b) / 2);
if(rezultat == -1)
return gaseste(a, ((a+b) / 2));
else if (rezultat == 1)
return gaseste(((a+b) / 2), b);
else return (a+b) / 2;
}
int main()
{
int i, total = 0, inceput, drumuri_curente, tmp, max;
in>>nr_saltele>>max_drumuri;
max = saltele[0];
for(i = 0; i< nr_saltele; i++)
{
in>>saltele[i];
total += saltele[i];
if(max < saltele[i])
max = saltele[i];
}
inceput = total / (max_drumuri-1);
tmp = gaseste(max, total);
while(check_value(tmp) == 0)
tmp--;
tmp++;
out<<tmp;
return 0;
}