Cod sursa(job #1420044)

Utilizator vladrochianVlad Rochian vladrochian Data 17 aprilie 2015 14:03:07
Problema Lapte Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
#include <cstring>
using namespace std;

const int kMaxN = 130;

int N, L;
pair<int, int> p[kMaxN];

int d[kMaxN][kMaxN];
int q[kMaxN][kMaxN];
int tmin, ans[kMaxN];

int& A(int i) {
	return p[i].first;
}
int& B(int i) {
	return p[i].second;
}

void Read() {
	ifstream fin("lapte.in");
	fin >> N >> L;
	for (int i = 1; i <= N; ++i)
		fin >> A(i) >> B(i);
}

bool Check(int T) {
	memset(d, -1, sizeof d);
	for (int i = 0; i <= L && i * A(1) <= T; ++i)
		d[1][i] = (T - i * A(1)) / B(1);

	for (int i = 2; i <= N; ++i)
		for (int j = 0; j <= L; ++j)
			for (int k = 0; k <= j && k * A(i) <= T; ++k)
				if (d[i - 1][j - k] >= 0) {
					int nw = d[i - 1][j - k] + (T - k * A(i)) / B(i);
					if (nw > d[i][j]) {
						d[i][j] = nw;
						q[i][j] = k;
					}
				}

	return d[N][L] >= L;
}

void Solve() {
	for (int step = 64; step; step >>= 1)
		if (!Check(tmin | step))
			tmin |= step;

	++tmin;
	Check(tmin);

	for (int i = N, sum = L; i; --i) {
		ans[i] = q[i][sum];
		sum -= ans[i];
	}
}

void Print() {
	ofstream fout("lapte.out");
	fout << tmin << "\n";
	for (int i = 1; i <= N; ++i)
		fout << ans[i] << " " << (tmin - ans[i] * A(i)) / B(i) << "\n";
}

int main() {
	Read();
	Solve();
	Print();
	return 0;
}