Cod sursa(job #1299455)

Utilizator heracleRadu Muntean heracle Data 23 decembrie 2014 17:42:46
Problema Lapte Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.93 kb
#include <cstdio>
#include <cstring>
#include <unordered_map>

FILE* in=fopen("lapte.in","r");
FILE* out=fopen("lapte.out","w");

int n,l;

const int Q=101;

int a[Q],b[Q];

int sa[Q*Q];//,sb[Q*Q];



int frm,sainit;

int ra[Q],rb[Q];

struct doblu{
    int val,raval,i;
};

std::unordered_map<int,doblu> map[Q*Q];

int r1,r2;

bool bun2(int t)
{
    memset(sa,0,sizeof sa);
   // memset(sb,0,sizeof sb);

    int g;

    int init;

    for(int i=1; i<=n; i++)
    {
        for( g=10000; g>0; g--)
        {
            if(sa[g]!=0)
            {
                init=sa[g];
                for(int j=0; j*a[i]<=t; j++)
                {
                    if(sa[g+j]<init+((t-j*a[i])/b[i]) )
                    {
                        sa[g+j]=init+((t-j*a[i])/b[i]);
                        map[g+j][sa[g+j] ]=doblu{g,init,i};

                        if(g+j>=l && sa[g+j]>=l)
                        {
                            r1=g+j;
                            r2=sa[g+j];
                            return 1;

                        }
                    }
                }
            }
        }
        for(int j=0; j*a[i]<=t; j++)
        {
            if(sa[j]<((t-j*a[i])/b[i]) )
            {
                sa[j]=((t-j*a[i])/b[i]);
                map[j][sa[j]]=doblu{0,0,i};

                if(j>=l && sa[j]>=l)
                {
                    r1=j;
                    r2=sa[j];
                    return 1;
                }

            }
        }

    }
    return 0;

    return 0;
}


bool bun(int t)
{
    memset(sa,0,sizeof sa);
   // memset(sb,0,sizeof sb);

    int g;

    int init;

    for(int i=1; i<=n; i++)
    {
        for( g=10000; g>0; g--)
        {
            if(sa[g]!=0)
            {
                init=sa[g];
                for(int j=0; j*a[i]<=t; j++)
                {
                    if(sa[g+j]<init+((t-j*a[i])/b[i]) )
                    {
                        sa[g+j]=init+((t-j*a[i])/b[i]);

                        if(g+j>=l && sa[g+j]>=l)
                            return 1;
                    }
                }
            }
        }
        for(int j=0; j*a[i]<=t; j++)
        {
            if(sa[j]<((t-j*a[i])/b[i]) )
            {
                sa[j]=((t-j*a[i])/b[i]);

                if(j>=l && sa[j]>=l)
                    return 1;
            }
        }

    }
    return 0;

    return 0;
}

int main()
{
    fscanf(in,"%d%d",&n,&l);

    for(int i=1; i<=n; i++)
        fscanf(in,"%d%d",&a[i],&b[i]);

    int p=64,k=0;

    while(p)
    {
        if( !bun(p+k) )
            k+=p;
        p/=2;
    }

    fprintf(out,"%d\n",k+1);

    bun2(k+1);


    int act1=r1,act2=r2,b1,b2,i;

    while(act1)
    {
        b1=map[act1][act2].val;
        b2=map[act1][act2].raval;
        i=map[act1][act2].i;

        ra[i]=act1-b1;
        rb[i]=act2-b2;

        act1=b1;
        act2=b2;
    }


    frm=-1;

    for(int i=1; i<=n; i++)
        fprintf(out,"%d %d\n",ra[i],rb[i]);

    return 0;
}