Cod sursa(job #596032)

Utilizator elfusFlorin Chirica elfus Data 15 iunie 2011 15:21:19
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<stdio.h>
#define INF -6971 //e numar prim :P
#define max(a,b) (a > b ? a : b)

int N,L,A[112][112],last[112][112];

struct pozdy
{
int a,b;
} x[112];

void read()
{
int i;

freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);

scanf("%d%d",&N,&L);
for(i=1;i<=N;i++)
	scanf("%d%d",&x[i].a,&x[i].b);
}

int ok(int T)
{
int i,j,k;
for(i=1;i<=N;i++)
	for(j=0;j<=L;j++)
		A[i][j]=INF;
for(i=0;x[1].a*i<=T;i++)
	A[1][i]=(T-x[1].a*i)/x[1].b;
for(i=2;i<=N;i++)
	for(j=0;j<=L;j++)
		if(A[i-1][j]!=INF)
			for(k=0;x[i].a*k<=T && j+k<=L;k++)
				{
				if(i==3)
					printf("");
				if(A[i-1][j]+(T-x[i].a*k)/x[i].b > A[i][j+k])
					last[i][j+k]=j;
				A[i][j+k]=max(A[i][j+k],A[i-1][j]+(T-x[i].a*k)/x[i].b);
				}

return A[N][L]>=L;
}

void recon(int i,int j)
{
if(i==1)
	{
	printf("%d %d\n",j,A[i][j]);
	return;
	}
recon(i-1,last[i][j]);
printf("%d %d\n",j-last[i][j],A[i][j]-A[i-1][last[i][j]]);
}

void solve()
{
int st=1,dr=6971,m,lst=-1;
while(st<=dr)
	{
	m=(st+dr)/2;
	if(ok(m))
		lst=m,dr=m-1;
	else
		st=m+1;
	}
printf("%d\n",lst);
lst=ok(lst);
recon(N,L);
}

int main()
{
read();
solve();
return 0;
}