Cod sursa(job #1784533)

Utilizator ASTELOTudor Enescu ASTELO Data 20 octombrie 2016 10:23:15
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<cstdio>
struct eu{int x,y;};
eu v[101],v1[101];
struct eu2{int x,dudv,val1,val2;};
eu2 a[101][101];
int i,j,n,m,l,l1,l2,mid,o,k;
int main ()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d%d",&n,&l);
for(i=1;i<=n;i++)
    scanf("%d%d",&v[i].x,&v[i].y);
l1=1;
l2=1000000;
while(l1<=l2)
    {
    mid=(l1+l2)/2;
    for(i=0;i<=n;i++)
        for(j=0;j<=l;j++)
            a[i][j].x=-10000000;
    a[0][0].x=0;
    for(i=1;i<=n;i++)
        for(j=0;j<=l;j++)
            for(k=0;k*v[i].y<=mid&&j+k<=l;k++)
                {
                if(a[i][j+k].x<a[i-1][j].x+(mid-k*v[i].y)/v[i].x)
                    {
                    a[i][j+k].x=a[i-1][j].x+(mid-k*v[i].y)/v[i].x;
                    a[i][j+k].dudv=j;
                    a[i][j+k].val1=(mid-k*v[i].y)/v[i].x;
                    a[i][j+k].val2=k;
                    }
                }
    if(a[n][l].x>=l)
        {
        o=mid;
        int poz=l;
        for(i=n;i>=1;i--)
            {
            v1[i].x=a[i][poz].val1;
            v1[i].y=a[i][poz].val2;
            poz=a[i][poz].dudv;
            }
        l2=mid-1;
        }
    else
        l1=mid+1;
    }
printf("%d\n",o);
for(i=1;i<=n;i++)
    printf("%d %d\n",v1[i].x,v1[i].y);
return 0;
}