Cod sursa(job #26150)

Utilizator marius135Dumitran Adrian Marius marius135 Data 5 martie 2007 11:42:05
Problema Lapte Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxl 201
long L,n;
int sal[maxl+1][maxl+1];
long v[101][2];
int last[101][maxl+1][maxl+1][2];
long sool[101][2];

void afisare(long a,long b,long c)
{
long i;
while(c)
  {
  sool[c][0]=last[c][a][b][0];
  sool[c][1]=last[c][a][b][1];
  a=a-sool[c][0];
  b=b-sool[c][1];
  c--;
  }
for(i=1;i<=n;i++)
  printf("%ld %ld\n",sool[i][0],sool[i][1]);

}
long sol(long a,long b)
{
long i,k,j,l;
memset(sal,0,sizeof(sal));
sal[0][0]=1;
for(k=1;k<=n;k++)
  {
  for(i=L+100;i>=0;i--)
    {
    for(j=L+100;j>=0;j--)
	{
	if(sal[i][j])
		{
		long st=0;
		long dr=a/v[k][0];
		if(i>=L) dr=0;
		if(j>=L) st=dr;
		for(l=st;l<=dr;l++)
			{
			sal[i+l][j+(a-l*v[k][0])/v[k][1]]=1;
			last[k][i+l][j+(a-l*v[k][0])/v[k][1]][0]= l;
			last[k][i+l][j+(a-l*v[k][0])/v[k][1]][1]= (a-l*v[k][0])/v[k][1];
			if(i+l>=L && j+(a-l*v[k][0])/v[k][1]>=L)
				{
				if(b==0)
					return 1;
				else {afisare(i+l,j+(a-l*v[k][0])/v[k][1],k);return 1;}
				}
		/*if(i+l>=L && k <n) 
			{
			long sss = j+(a-l*v[k][0])/v[k][1];
			for(long p=k+1;p<=n;p++) sss+= a/v[p][1];
			if(sss>=L)
				{
				sss = j+(a-l*v[k][0])/v[k][1];
				for(long p=k+1;p<=n;p++) 
					{
					sal[i+l][sss+a/v[p][1]]=1;
					last[p][i+l][sss+a/v[p][1]][0]= l;
					last[p][i+l][sss+a/v[p][1]][1]= sss;
					sss+=a/v[p][1];
					if(sss>=L) 
						 {afisare(i+l,sss,p);return 1;}
					}
				if(b==0) return 1;
					else
				}
			}*/
			}
		}
	}	}
	
  }
return 0;

}

long cauta(long a,long b)
{
if(a==b) return a;
long mij=(a+b)/2;
if(sol(mij,0)) return cauta(a,mij);
else return cauta(mij+1,b);

}



int main()
{
long x,i;

freopen("lapte.in","rt",stdin);
freopen("lapte.out","wt",stdout);

scanf("%ld%ld",&n,&L);
for(i=1;i<=n;i++)
  scanf("%ld%ld",&v[i][0],&v[i][1]);
x=cauta(1,100);
printf("%ld\n",x);
sol(x,1);


return 0;
}