Cod sursa(job #476700)

Utilizator ilincaSorescu Ilinca ilinca Data 12 august 2010 02:27:00
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <cstdio>

#define nmax 105

int n, l, A [nmax], B [nmax], a [nmax] [nmax] [nmax], b [nmax] [nmax] [nmax];
bool e [nmax] [nmax] [nmax];

void scan ()
{
	int i;
	scanf ("%d%d", &n, &l);
	for (i=1; i <= n; ++i) scanf ("%d%d", &A [i], &B [i]);
}	

inline int min (int a, int b)
{return (a<b)? a : b;}

bool ok (int w)
{
	int i, j, k, v1, v2;
	
	for (i=0; i <= n; ++i)
	{
		for (j=0; j <= l; ++j)
			for (k=0; k <= l; ++k) {a [i] [j] [k]=b [i] [j] [k]=0; e [i] [j] [k]=false;}
		e [i] [0] [0]=true;
	}	
		
	for (i=1; i <= n; ++i)
		for (j=0; j <= l; ++j)
			for (k=0; k <= l; ++k)
			{
				if (j+k == 0) continue;
				//fprintf (stderr, "%d %d %d ", i, j, k);if (e [i-1] [j] [k]) fprintf (stderr, "1\n");
				if (e [i-1] [j] [k]) 
				{e [i] [j] [k]=true;  a [i] [j] [k]=b [i] [j] [k]=0; continue;}
				//fprintf (stderr, "!!!!!!!!");
				v1=v2=w+1;
				if (j != 0 && e [i] [j-1] [k])
					if (a [i] [j-1] [k]+b [i] [j-1] [k]+A [i] <= w) v1=a [i] [j-1] [k] + b [i] [j-1] [k] + A [i];
				if (k != 0 && e [i] [j] [k-1])
					if (a [i] [j] [k-1]+b [i] [j] [k-1]+B [i] <= w) v2=a [i] [j] [k-1] + b [i] [j] [k-1] + B [i];
				if (v1 < v2)
				{
					if (v1 <= w)
					{
					a [i] [j] [k]=a [i] [j-1] [k]+A [i];
					b [i] [j] [k]=b [i] [j-1] [k];
					e [i] [j] [k]=true;	
					}
				}
				else
				{
					if (v2 <= w)
					{
					a [i] [j] [k]=a [i] [j] [k-1];
					b [i] [j] [k]=b [i] [j] [k-1]+B [i];
					e [i] [j] [k]=true;
					}
				}	
				//printf ("%d %d %d %d %d\n", i, j, k, a [i] [j] [k], b [i] [j] [k]);
			}
//fprintf (stderr, "%d %d %d\n", w, a [n] [l] [l], l);	
	return e [n] [l] [l];
}

int cbin ()
{
	int i, s=1<<6;
	for (i=0; s; s >>= 1)
		if (!ok (i+s)) i+=s;
	return i+1;
}

void print (int w, int x, int y)
{
	if (w == 0) return;
	int as, bs;
	//fprintf (stderr, "%d %d %d %d %d\n", w, x, y, a [w] [x] [y], b [w] [x] [y]);
	as=a [w] [x] [y]/A [w];
	bs=b [w] [x] [y]/B [w];
	print (w-1, x-as, y-bs);
	printf ("%d %d\n", as, bs);
}

int main ()
{
	freopen ("lapte.in", "r", stdin);
	freopen ("lapte.out", "w", stdout);
	scan ();
	int x=cbin ();
	printf ("%d\n", x);
	ok (x);
	print (n, l, l);
	return 0;
}