Cod sursa(job #1045040)

Utilizator rcalitaCalita Raluca rcalita Data 30 noiembrie 2013 20:03:37
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#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) -1);
	else if (rezultat == 1)
		return gaseste(((a+b) / 2)-1, 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;

	tmp = gaseste(max, inceput);
	while(check_value(tmp) == 0)
		tmp--;
	tmp++;
	out<<tmp;


    return 0;
}