Cod sursa(job #257599)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 13 februarie 2009 17:35:37
Problema Lapte Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>
#define lm 110

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

bool verif(int t)
{
    int i, j, x, k;
    for (i=0; i<=n; i++)
	    for (j=0; j<=l; j++) v[i][j]=-1;
	v[0][0]=0;
	for (i=1; i<=n; i++)
	    for (j=0; j<=l; j++)
			for (x=0; x<=t; x++)
                if (v[i-1][j-x/a[i]]>=0)
	    		    {
    	    		    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)
	{
	    for (i=1; i<=n; i++)
		    for (j=0; j<=l; j++) C[i][j]=c[i][j];
	    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,n*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-r1[i];
    }
	for (i=1; i<=n; i++) printf("%d %d\n",r1[i],r2[i]);
}