Cod sursa(job #476698)

Utilizator ilincaSorescu Ilinca ilinca Data 12 august 2010 02:19:38
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <cstdio>
#include <cstring>

#define nmax 105

struct trei
{
	int a, b;
	bool e;
};

int n, l, A [nmax], B [nmax];
trei a [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;
	
	memset (a, 0, sizeof (a));
	for (i=0; i <= n; ++i)
		a [i] [0] [0].e=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 (a [i-1] [j] [k].e) 
				{a [i] [j] [k].e=true;  a [i] [j] [k].a=a [i] [j] [k].b=0; continue;}
				//fprintf (stderr, "!!!!!!!!");
				v1=v2=w+1;
				if (j != 0 && a [i] [j-1] [k].e)
					if (a [i] [j-1] [k].a+a [i] [j-1] [k].b+A [i] <= w) v1=a [i] [j-1] [k].a + a [i] [j-1] [k].b + A [i];
				if (k != 0 && a [i] [j] [k-1].e)
					if (a [i] [j] [k-1].a+a [i] [j] [k-1].b+B [i] <= w) v2=a [i] [j] [k-1].a + a [i] [j] [k-1].b + B [i];
				if (v1 < v2)
				{
					if (v1 <= w)
					{
					a [i] [j] [k].a=a [i] [j-1] [k].a+A [i];
					a [i] [j] [k].b=a [i] [j-1] [k].b;
					a [i] [j] [k].e=true;	
					}
				}
				else
				{
					if (v2 <= w)
					{
					a [i] [j] [k].a=a [i] [j] [k-1].a;
					a [i] [j] [k].b=a [i] [j] [k-1].b+B [i];
					a [i] [j] [k].e=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 a [n] [l] [l].e;
}

int cbin ()
{
	int i, s=1<<30;
	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/A [w];
	bs=a [w] [x] [y].b/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;
}