Cod sursa(job #555843)

Utilizator feelshiftFeelshift feelshift Data 15 martie 2011 20:01:38
Problema Transport Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
// http://infoarena.ro/problema/transport
#include <fstream>
using namespace std;

const int maxSize = 16001;

ifstream in("transport.in");
ofstream out("transport.out");

int length,maxTransports;
int size[maxSize];

int transports(int capacity);

int main() {
	in >> length >> maxTransports;
	for(int i=1;i<=length;i++)
		in >> size[i];

	int left = 1;
	int capacity;
	int right = maxSize;

	while(left < right) {
		capacity = (left + right) / 2;
		int currentTransports = transports(capacity);

		if(currentTransports > maxTransports)
			left = capacity + 1;
		else
			if(currentTransports < maxTransports)
				right = capacity;
			else
				if(transports(capacity-1) == currentTransports)
					right = capacity;
				else
					break;
	}

	//out << transports(8);
	out << capacity << "\n";

	return (0);
}

int transports(int capacity) {
	int answer = 0;
	int currentLoad = 0;
	for(int i=1;i<=length;i++)
		if(currentLoad + size[i] <= capacity)
			currentLoad += size[i];
		else {
			currentLoad = size[i];
			answer++;
		}

	if(currentLoad)
		answer++;

	return answer;
}