Cod sursa(job #1438842)

Utilizator MarianVasilcaMarian Vasilca MarianVasilca Data 20 mai 2015 23:21:19
Problema Transport Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <stdlib.h>

const char *in_file_name = "transport.in";
const char *out_file_name = "transport.out";

using namespace std;

ifstream in_file;
ofstream out_file;

int N, K, maxim = 0;
int *volume;

void die(bool assertion, const char *message)
{
	if (assertion) {
		fprintf(stderr, "(%s, %d): ",__FILE__, __LINE__);
		perror(message);
		exit(EXIT_FAILURE);
	}
}

bool transport(int middle)
{
	int sum = 0, counter = 0;

	for (int i = 0; i < N; i++) {
		if (sum + volume[i] <= middle)
			sum += volume[i];
		else {
				sum = volume[i];
				counter++;
		}
	}

	if (counter < K)
		return true;
	else
		return false;

}

int solve()
{
	int middle = 1, left = 1, right = maxim * maxim;
	bool result;

	while (left <= right) {

		middle = (left + right) / 2;
		result = transport(middle);

		if (result)
			right = middle - 1;
		else
			left = middle + 1;

	}

	return left;

}

void read_file()
{

	int val;

	in_file >> N >> K;
	volume = new int[N];

	for (int i = 0; i < N; i++) {
		in_file >> val;
		volume[i] = val;
		maxim = max(val, maxim);
	}
}

int main()
{

	in_file.open(in_file_name, ios::in);
	die(!in_file, "Error opening file for reading");

	out_file.open(out_file_name, ios::out);
	die(!out_file, "Error opening file for writing");

	read_file();

	out_file << solve();

	in_file.close();
	out_file.close();

	delete []volume;

	return 0;
}