Cod sursa(job #476699)

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

#define nmax 105
#define a first
#define b second.first
#define e second.second

using namespace std;

int n, l, A [nmax], B [nmax];
pair <int, pair <int, bool> > f [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 x, int y)
{return (x<y)? x : y;}

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