Cod sursa(job #561246)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 19 martie 2011 13:56:28
Problema Lapte Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <iostream>
#include <string>

using namespace std;

#define NM 105
#define inf 1000000000

int N, L, A[NM], B[NM], LMAX[NM][NM], C[NM][NM], ANS[NM][2];

int posibil(int timp)
{
	for (int l = 1; l <= L; ++l) LMAX[0][l] = -inf;

	for (int i = 1; i <= N; ++i)
	{
		for (int l = 0; l <= L; ++l) LMAX[i][l] = -inf;
		
		for (int l = 0; l <= L; ++l)
			for (int c = 0; c <= l; ++c)
			{
				if (c * A[i] > timp) break;
				
				if (LMAX[i][l] < (int)(LMAX[i-1][l-c] + (timp - c * A[i])/B[i])) 
				{	
					LMAX[i][l] = LMAX[i-1][l-c] + (timp - c * A[i])/B[i];
					C[i][l] = c;
				}	
			}	
	}	
	
	if (LMAX[N][L] >= L) return 1;
	return 0;
}

int main()
{
	freopen ("lapte.in", "r", stdin);
	freopen ("lapte.out", "w", stdout);
	
	scanf ("%d %d", &N, &L);
	
	for (int i = 1; i <= N; ++i) scanf ("%d %d", &A[i], &B[i]);
	
	int tmin = 1, tmax = 10000;
	
	while (tmin < tmax)
	{
		int tmid = (tmin + tmax)/2;
		
		if (posibil(tmid)) tmax = tmid;
		else tmin = tmid + 1;
	}	
	
	int ans = tmin;
	
	printf ("%d\n", ans);
	
	for (int i = N; i >= 1; --i)
	{
		ANS[i][0] = C[i][L];
		ANS[i][1] = (ans - C[i][L]*A[i])/B[i];
		L -= C[i][L];
	}	
	
	for (int i = 1; i <= N; ++i) printf ("%d %d\n", ANS[i][0], ANS[i][1]);
	
	return 0;
}