Cod sursa(job #29995)

Utilizator alextheroTandrau Alexandru alexthero Data 12 martie 2007 10:04:30
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
// c[i][j]  - cantitatea maxima de lapte b bauta astfel incat primii i
// 			  bautori sa bea cantitatea j de lapte A
//

#include <stdio.h>
#include <algorithm>

#define nmax 105
#define lmax 105

using namespace std;

int deunde[nmax][lmax];
int cA[nmax],cB[nmax];
int lA[nmax],lB[nmax];
int n,l,i;
int c[nmax][lmax];

void delay() {
	for(int i = 1; i <= 30000; i++)
		for(int j = 1; j <= 10000; j++) ;
}

int bun(int x) {
	int i,j,k;
	for(i = 0; i <= n; i++) 
		for(j = 0; j <= l; j++) 
			c[i][j] = -1;

	c[0][0] = 0;	
	for(i = 1; i <= n; i++) 
		for(j = 0; j <= l; j++) {
			c[i][j] = -1;
			for(k = 0; k <= j; k++) 
				if(c[i - 1][k] != -1) {
					int tlA = (j - k) * lA[i];
					if(tlA <= x) 
						if(c[i][j] < c[i - 1][k] + (x - tlA) / lB[i]) {
							c[i][j] = c[i - 1][k] + (x - tlA) / lB[i];
							deunde[i][j] = k;
						}
				}
		}
	if(c[n][l] >= l) return 1;
	else return 0;
}

int cauta(int f,int l) {
	int r = l + 1;
	while(f <= l) {
		int m = (f + l) / 2;
		if(bun(m)) {
			r = m;
			l = m - 1;
		}
		else f = m + 1;
	}
	return r;
}

int main() {
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	
	
	scanf("%d%d",&n,&l);
	for(i = 1; i <= n; i++) scanf("%d%d",&lA[i],&lB[i]);

	int t = cauta(1,100);

	printf("%d\n",t);
	bun(t);

	int A = l;
	for(i = n; i >= 1; i--) {
		cB[i] = c[i][A] - c[i - 1][deunde[i][A]];
		cA[i] = A - deunde[i][A];
		A = deunde[i][A];
	}

	for(i = 1; i <= n; i++) printf("%d %d\n",cA[i],cB[i]);

	return 0;
}