Cod sursa(job #810281)

Utilizator toranagahVlad Badelita toranagah Data 10 noiembrie 2012 00:23:58
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int MAX_N = 110;
int N, L;
int a[MAX_N], b[MAX_N];
int pd[MAX_N][MAX_N], order[MAX_N][MAX_N];
int result, rA[MAX_N], rB[MAX_N];

void read_input();
void binary_search();
bool testSolution(int val);
void rebuild();
void write_output();

int main() {
	read_input();
	binary_search();
	rebuild();
	write_output();
	return 0;
}

void read_input() {
	fin >> N >> L;
	for (int i = 1; i <= N; ++i) {
		fin >> a[i] >> b[i];
	}
}

void binary_search() {
	int lo = 1, hi = 101;
	while (lo < hi) {
		int mid = lo + (hi - lo) / 2;
		if (testSolution(mid) == true) {
			hi = mid;
		} else {
			lo = mid + 1;
		}
	}
	result = lo;
}

bool testSolution(int val) {
	for (int i = 0; i <= N; ++i) {
		for (int j = 0; j <= L; ++j) {
			pd[i][j] = -1;
		}
	}
	pd[0][0] = 0;
	for (int i = 1; i <= N; ++i) {
		for (int j = 0; j <= L; ++j) {
			for (int k = 0; k <= j; ++k) {
				if (pd[i-1][k] != -1 && (j - k) * a[i] <= val 
			      && pd[i-1][k] + (val - a[i] * (j - k)) / b[i] > pd[i][j]) {
					pd[i][j] = pd[i-1][k] + (val - a[i] * (j - k)) / b[i];
					order[i][j] = k;
				}
			}
		}
	}
	if (pd[N][L] >= L) {
		return true;
	}
	return false;
}

void rebuild() {
	int l = L;
	testSolution(result);
	for (int i = N ; i > 0; --i) {
		rA[i] = l - order[i][l];
		rB[i] = pd[i][l] - pd[i - 1][order[i][l]];
		l = order[i][l];
	}
}

void write_output() {
	fout << result << '\n';
	for (int i = 1; i <= N; ++i) {
		fout << rA[i] << ' ' << rB[i] << '\n';
	}
}