Cod sursa(job #838437)

Utilizator cat_red20Vasile Ioana cat_red20 Data 19 decembrie 2012 18:13:15
Problema Lapte Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include<stdio.h>

int d[102][102],n,l,tmin;
struct tip
{
    int a,b;
}sol[102],v[102];

void citire()
{
    freopen("lapte.in","r",stdin);
    scanf("%d %d",&n,&l);
    for(int i=1;i<=n;i++)
    {
        scanf("%d %d",&v[i].a,&v[i].b);
    }
}

int verif(int t)
{
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=l;j++)
        {
            d[i][j]=-1;
        }
    }
    d[0][0]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=l;j++)
        {
            for(int k=0;k<=j && k*v[i].a<=t;k++)
            {
                if(d[i-1][j-k]!=-1 && d[i][j]<d[i-1][j-k]+(t-k*v[i].a)/v[i].b)
                {
                    d[i][j]=d[i-1][j-k]+(t-k*v[i].a)/v[i].b;
                }
            }
        }
    }
    if(d[n][l]>=l)
    return 1;
    return 0;
}

void cauta()
{
    int p=1,u=100,m;
    while(p<=u)
    {
        m=(p+u)/2;
        if(verif(m))
        {
            u=m-1;
            tmin=m;
        }
        else
        {
            p=m+1;
        }
    }
}

void reconst(int t)
{
    int ok=verif(t),j=l;
    for(int i=n;i>=1;i--)
    {
        for(int k=0;k<=j && k*v[i].a<=t;k++)
        {
            if(d[i][j]==d[i-1][j-k]+(t-k*v[i].a)/v[i].b)
            {
                j=j-k;
                sol[i].a=k;
                sol[i].b=(t-k*v[i].a)/v[i].b;
                break;
            }
        }
    }
}

void afisare()
{
    for(int i=1;i<=n;i++)
    {
        printf("\n%d %d",sol[i].a,sol[i].b);
    }
}

int main()
{
    citire();
    cauta();
    freopen("lapte.out","w",stdout);
    printf("%d",tmin);
    reconst(tmin);
    afisare();
    return 0;
}