Cod sursa(job #447658)

Utilizator sliceskullcandySlice Skull Candy sliceskullcandy Data 29 aprilie 2010 21:30:28
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
//infoarena
//sliceskullcandy

#include <stdio.h>
#include <string.h>

long w[102][102],z[102],a[102],b[102],N,L,T,mina,minb,i,st[10001],S[10001],D[10001];

long gnt(long t)
{
	long i,j,k,max;

	memset(w,0,sizeof(w));
	memset(z,0,sizeof(z));
	for(i=1;i<=N;i++)
	{
		z[i]=t/a[i];
		for(j=0;j<=z[i];j++)
			w[i][j]=(t-a[i]*j)/b[i];
	}

	D[0]=0;
	S[0]=0;
	st[0]=0;
	memset(D,-1,sizeof(D));
	memset(st,0,sizeof(st));
	memset(S,0,sizeof(S));
	max=0;
	for(i=1;i<=N;i++)
		for(j=0;j<=z[i];j++)
			for(k=0;k<=max;k++)
				if(D[k]!=-1&&st[k]!=i)
					if(D[k+w[i][j]]==-1)
					{
						D[k+w[i][j]]=w[i][j];
						st[k+w[i][j]]=i;
						S[k+w[i][j]]=S[k]+j;
						if(max<k+w[i][j]) max=w[i][j];
					}
					else
					if(S[k+w[i][j]]<S[k]+j)
					{
						D[k+w[i][j]]=w[i][j];
						st[k+w[i][j]]=i;
						S[k+w[i][j]]=S[k]+j;
						if(max<k+w[i][j]) max=w[i][j];
					}

	int ok=1;
	i=L;
	while(D[i]!=-1)
	{
		if(S[i]>=L)
		{
			ok=0;
			break;
		}
		i++;
	}

	return ok;
}

long BS(long L,long R)
{
	long m,ok;

	if(L<R)
	{
		m=(L+R)/2;
		ok=gnt(m);
		if(ok==0) return BS(m+1,R);
		else
		if(ok==1) return BS(L,m);
	}
	else
	if(L==R) return R;
}

int main()
{
	freopen("lapte.in","r",stdin);

	scanf("%ld%ld",&N,&L);
	mina=101;
	minb=101;
	for(i=1;i<=N;i++)
	{
		scanf("%ld%ld",&a[i],&b[i]);
		if(a[i]<mina) mina=a[i];
		if(b[i]<minb) minb=b[i];
	}

	T=BS(((mina+minb)*L)/N,(mina+minb)*L);

	freopen("lapte.out","w",stdout);

	printf("%ld\n",T);


	return 0;
}