Cod sursa(job #798252)

Utilizator catalinb91Catalin Badea catalinb91 Data 15 octombrie 2012 23:43:15
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <iostream>
#include <fstream>
#include <vector>

std::ifstream input("transport.in");
std::ofstream output("transport.out");

bool check(long long value, int max, std::vector<int>& base);

long long binary (long long left, long long right, std::vector<int>& base, int max) {
	if (left >= right)
		return right;

	long long m = (left + right) / 2;

	if (check(m, max, base))
		return binary(left, m, base, max);
	else
		return binary(m + 1, right, base, max);
}

bool check(long long value, int max, std::vector<int>& base) {
	long long current = value;
	for (size_t i = 0; i < base.size(); i++) {
		if (current >= base[i]) {
			current -= base[i];
		} else {
			max--;
			current = value;
			if (current >= base[i])
				current -= base[i];
			else
				return false;
		}
	}

	if (current != value)
		max--;

	if (max < 0)
		return false;

	std::cout << "OK: " << value << ": " << max << "\n";
	return true;
}

int main() {
	int n, k;
	input >> n >> k;

	std::vector<int>* base = new std::vector<int>();
	long long sum = 0;
	long max = 0;

	for (int i = 0; i < n; i++) {
		int value;
		input >> value;
		base->push_back(value);

		// partial sums
		sum += value;

		if (max < (*base)[i])
			max = (*base)[i];
	}

	output << binary(max, sum, *base, k);
}