Pagini recente » Cod sursa (job #376467) | Cod sursa (job #3203758) | Rating Laurentiu Capatina (lau08) | Cod sursa (job #772979) | Cod sursa (job #3288736)
#include <cmath>
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
int maxStack (stack<int> saltele)
{
int max = saltele.top();
int saltea = 0;
while (!saltele.empty())
{
saltea = saltele.top();
if (saltea > max)
{
max = saltea;
}
saltele.pop();
}
return max;
}
int stackTraverse (stack<int> saltele, int drumuri, int max_cargo)
{
int drum_curent = max_cargo;
int saltea;
int sol = 0;
while (!saltele.empty() && drumuri > 0)
{
saltea = saltele.top();
if (drum_curent - saltea >= 0)
{
drum_curent -= saltea;
}
else
{
drum_curent = max_cargo - saltea;
sol++;
drumuri--;
}
saltele.pop();
}
if (saltele.empty())
{
return sol;
}
return 0;
}
int binarySearch (stack<int> saltele, int drumuri)
{
int cargo_low = maxStack(saltele);
int cargo_high = cargo_low * 2;
int cargo_mid;
int sol_low = 0, sol_mid = 0, sol_high = 0;
while (true)
{
sol_low = stackTraverse(saltele, drumuri, cargo_low);
sol_high = stackTraverse(saltele, drumuri, cargo_high);
if (cargo_low + 1 == cargo_high)
{
if (sol_high != 0)
{
return sol_low;
}
else
{
return sol_high;
}
}
cargo_mid = cargo_low + (cargo_high - cargo_low) / 2;
sol_mid = stackTraverse(saltele, drumuri, cargo_mid);
if (sol_mid == 0)
{
cargo_low = cargo_mid;
}
else
{
cargo_high = cargo_mid;
}
}
}
int main() {
ifstream fin("transport.in");
ofstream fout("transport.out");
stack<int> saltele;
int n, drumuri, saltea;
fin >> n >> drumuri;
for (int i = 0; i <= n; i++)
{
fin >> saltea;
saltele.push(saltea);
}
fout << binarySearch(saltele, drumuri);
return 0;
}