Cod sursa(job #827288)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 1 decembrie 2012 22:06:59
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int MAXN = 111;

int N, L;
int A[MAXN], B[MAXN];
int D[MAXN][MAXN];
int Reconst[MAXN][MAXN];

inline int _max (const int &A, const int &B)
{
	if (A > B)
		return A;
	
	return B;
}

inline bool ok (int T)
{
	int i, j, k;
	
	for (i = 0; i < MAXN; i ++)
		for (j = 0; j < MAXN; j ++)
			D[i][j] = -1;
	
	D[0][0] = 0;
	for (i = 1; i <= N; i ++)
		for (j = 0; j <= L; j ++)
			for (k = 0; k <= T / B[i] && k <= j; k ++)
				if (D[i - 1][j - k] != -1 && (D[i - 1][j - k] + (T - k * B[i]) / A[i]) > D[i][j]){
					D[i][j] = D[i - 1][j - k] + (T - k * B[i]) / A[i];
					Reconst[i][j] = j - k;
				}
				
	return (D[N][L] >= L);
}

int BS ()
{
	int step = (1 << 8), res = MAXN;
	
	for ( ; step; step >>= 1)
		if (res - step >= 1 && ok (res - step))
			res -= step;
		
	return res;
}

void Afis (int i, int j)
{
	if (!i)
		return;
	Afis (i - 1, Reconst[i][j]);
	out << D[i][j] - D[i - 1][ Reconst[i][j] ] << " " << j - Reconst[i][j] << "\n";
}

int main ()
{
	int i, Ans;
	
	in >> N >> L;
	
	for (i = 1; i <= N; i ++)
		in >> A[i] >> B[i];
	
	Ans = BS ();
	out << Ans << "\n";
	Ans = ok (Ans);
	Afis (N, L);
	
	return 0;
}