Cod sursa(job #1167933)

Utilizator gabriel.badeaGabriel Badea gabriel.badea Data 6 aprilie 2014 12:24:55
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include<stdio.h>

int main()
{
	long long cmin = 1;								// capacitatea minima a camionului
	long long cmax = 5000000000000;					// capacitatea maxima a camionului
	long long c_actuala_din_camion_maxima;							// capacitatea actuala a camionului
	long long capacitatea_actuala_trimisa;									// capacitatea actuala trimisa
	int nr_transporturi_efectuate;							// nr de transporturi in capacitatea actuala
	long long capacitatea_minima = cmax;
	int p;
	freopen("transport.in", "r", stdin);
	freopen("transport.out", "w", stdout);

	int nr_saltele, nr_maxim_transporturi;
	int saltele[16500];

	scanf("%d%d", &nr_saltele, &nr_maxim_transporturi);
	for(int i = 0; i < nr_saltele; ++i)
	{
		scanf("%d", &saltele[i]);
	}

	while(cmin <= cmax)
	{
		c_actuala_din_camion_maxima = (cmin + cmax) / 2;
		int saltele_livrate = 0;
		nr_transporturi_efectuate = 0;
		do
		{
			capacitatea_actuala_trimisa = 0;
			while(capacitatea_actuala_trimisa < c_actuala_din_camion_maxima && saltele[saltele_livrate] < c_actuala_din_camion_maxima)
			{
				capacitatea_actuala_trimisa += saltele[saltele_livrate];
				saltele_livrate++;
				if(saltele_livrate == nr_saltele)
				{
					if(capacitatea_actuala_trimisa <= capacitatea_minima && capacitatea_actuala_trimisa <= c_actuala_din_camion_maxima)
					{
						capacitatea_minima = c_actuala_din_camion_maxima;
						cmax = c_actuala_din_camion_maxima - 1;
						break;
					}
					else if(capacitatea_actuala_trimisa > c_actuala_din_camion_maxima)
					{
						capacitatea_actuala_trimisa -= saltele[saltele_livrate-1];
						saltele_livrate--;
						break;
					}
				}
			}
			nr_transporturi_efectuate++;
			if(nr_transporturi_efectuate > nr_maxim_transporturi)
			{
				cmin = c_actuala_din_camion_maxima + 1;
				break;
			}
		}while(saltele_livrate < nr_saltele);
	}
		
	printf("%d\n", capacitatea_minima);

	return 0;
}