Cod sursa(job #256646)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 11 februarie 2009 23:10:06
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cstdio>
#define lm 110

int a[lm], b[lm], v[lm][lm], c[lm][lm], n, l, r1[lm], r2[lm];

bool verif(int t)
{
    int i, j, x, k;
    for (i=1; i<=n; i++)
	    for (j=0; j<=l; j++) v[i][j]=0;
    for (j=0; j<=t; j++) v[1][j]=t-j;
	for (i=2; i<=n; i++)
	    for (j=0; j<=l; j++)
			for (x=0; x<=t; x++)
			    {
    			    k=v[i-1][j-x/a[i]]+(t-x)/b[i];
					if (k>v[i][j])
					{
					    v[i][j]=k;
						c[i][j]=x;
                    }
                }
	if (v[n][l]>=l)
	    return 1; else
		return 0;
}


int caut(int a, int b)
{
    int m, r;
	while (a<=b)
	{
	    m=(a+b)/2;
		if (verif(m))
		{
		    b=m-1;
			r=m;
        } else a=m+1;
	}
	return r;
}


int main()
{
    freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	scanf("%d %d",&n,&l);
	int i;
	for (i=1; i<=n; i++) scanf("%d %d",&a[i],&b[i]);
	int r=caut(1,l);
	printf("%d\n",r);
	int k=l;
	for (i=n; i>0; i--)
	{
	    r1[i]=c[i][k]/a[i];
		r2[i]=(r-c[i][k])/b[i];
		k=k-c[i][k]/a[i];
    }
	for (i=1; i<=n; i++) printf("%d %d\n",r1[i],r2[i]);
}