Cod sursa(job #385549)

Utilizator katakunaCazacu Alexandru katakuna Data 22 ianuarie 2010 22:22:57
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define Nmax 102
#define INF 1 << 30

struct lapte {int a, b;} v[Nmax], Sol[Nmax];
int n, L, sol, i;
int a[Nmax][Nmax], D[Nmax][Nmax];

int verifica (int T) {
	
	int i, j, l, b;
	for (i = 1; i <= n; i++)
		memset (a[i], 0, sizeof (a[i]));
	
	for (i = 1; i <= L; i++)
		a[0][i] = -INF;
	
	for (i = 1; i <= n; i++)
		for (j = 0; j <= L; j++)  
			for (l = 0; l <= j; l++) {
				b = a[i-1][j - l];
				
				if ( l * v[i].a <= T ) 
					b+= (T - (l * v[i].a)) / v[i].b;
				else
					b = 0;
				
				if (a[i][j] < b) {
					a[i][j] = b;
					D[i][j] = l;
				}
			}
	
	if (a[n][L] >= L) return 1;
	return 0;
} 

void cauta () {
	
	int p = 1, u = v[1].a * L + v[1].b * L, mij;
	while (p <= u) {
		mij = (p + u) >> 1;
		if ( verifica (mij) ) {
			sol = mij;
			u = mij - 1;
		}
		
		else 
			p = mij + 1;
	}
}

void drum (int i, int j) {
	if (!i) return ;
	
	Sol[i].a = D[i][j];
	Sol[i].b = (sol - (D[i][j] * v[i].a)) / v[i].b;
	
	drum (i-1, j - D[i][j]);
}

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", &v[i].a, &v[i].b);
	
	cauta ();
	printf ("%d\n", sol);
	drum (n, L);
	
	for (i = 1; i <= n; i++)
		printf ("%d %d\n", Sol[i].a, Sol[i].b);
	
	return 0;
}