Cod sursa(job #1774850)

Utilizator silkMarin Dragos silk Data 9 octombrie 2016 15:25:16
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <cstdio>
#define NMax 100

int fiu[NMax+1][NMax+1][3];
int F[NMax+1][NMax+1][2];
int A[2][NMax+1][3];
int sol[NMax+1][2];
int is[2][NMax+1];
int x[NMax+1];
int y[NMax+1];
int N,L,T,q;

void Write()
{
    int i,x,y,z,aux;

    printf("%d\n",T);
    for(i = L; i <= NMax; ++i)
    if( A[q][i][0] >= L ) { z = i; break; }

    x = A[q][z][1];
    y = A[q][z][2];

    while(x)
    {
        sol[x][0] = F[x][y][0];
        sol[x][1] = F[x][y][1];

        aux = x;
        x = fiu[z][x][0];
        y = fiu[z][aux][1];
        z = fiu[z][aux][2];
    }

    for(i = 1; i <= N; ++i)
    printf("%d %d\n", sol[i][0], sol[i][1] );
}

void Set_all()
{
    int i,j,k;
    for(i = 1; i <= NMax; ++i)
        for(j = 1; j <= NMax; ++j)
            for(k = 0; k < 3; ++k) fiu[i][j][k] = 0;
    for(i = 0; i < 2; ++i )
        for(j = 0; j <= NMax; ++j)
            for(k = 0; k < 3; ++k) A[i][j][k] = 0;
    for(i = 0; i < 2; ++i)
        for(j = 0; j <= NMax; ++j) is[i][j] = 0;
}

bool is_good(int T)
{
    int i,j,k,a,b,t,l;

    Set_all();
    for(i = 1; i <= N; ++i)
    {
        for(t = 0, j = 0; x[i] * j <= T; ++j)
        {
            F[i][++t][0] = j;
            F[i][t][1] = ( T - x[i]*j ) / y[i];
        }

        F[i][0][0] = t;
    }

    is[0][0] = is[1][0] = 1;
    for(l = 0, i = 1; i <= N; ++i, l = 1-l)
        for(j = 1; j <= F[i][0][0]; ++j)
        {
            a = F[i][j][0];
            b = F[i][j][1];
            for(k = NMax-a; k >= 0; --k)
            if( is[l][k] )
            {
                if( !is[1-l][k+a] || A[1-l][k+a][0] < A[l][k][0] + b )
                {
                    fiu[k+a][i][0] = A[l][k][1];
                    fiu[k+a][i][1] = A[l][k][2];
                    fiu[k+a][i][2] = k;
                    A[1-l][k+a][0] = A[l][k][0] + b;
                    A[1-l][k+a][1] = i;
                    A[1-l][k+a][2] = j;
                    is[1-l][k+a] = 1;
                }
            }
        }

    for(i = L; i <= NMax; ++i)
    if( A[l][i][0] >= L ) { q = l; return 1; }
    return 0;
}

int main(){
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);

    int i,st,dr,mid;

    scanf("%d %d",&N,&L);
    for(i = 1; i <= N; ++i) scanf("%d %d",&x[i],&y[i]);

    for(st = 1, dr = NMax; st <= dr; )
    {
        mid = (st+dr)/2;
        if( is_good(mid) ) { T = mid; dr = mid - 1; }
        else st = mid + 1;
    }

    is_good(T);
    Write();



return 0;
}