Cod sursa(job #988787)

Utilizator florin.elfusFlorin Elfus florin.elfus Data 23 august 2013 21:13:07
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 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;
}