Pagini recente » Profil oldatlantian | Istoria paginii utilizator/etc.diana | Profil popescumalina | Profil oldatlantian | Cod sursa (job #447658)
Cod sursa(job #447658)
//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;
}