Cod sursa(job #257595)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 13 februarie 2009 17:19:49
Problema Lapte Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 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=1; i<=n; i++)
	    for (j=0; j<=l; j++) v[i][j]=-1;
	for (i=0; i<=l; i++) v[0][i]=0-i;
	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,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]);
}