Cod sursa(job #1142196)

Utilizator PatrikStepan Patrik Patrik Data 13 martie 2014 16:34:23
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define MAX 105
    int N , L , sol , a[MAX] , b[MAX] , d[MAX][MAX] , c[MAX][MAX]  , cant[MAX] , maxx , nr;
    bool u[MAX][MAX] ;

    int main()
    {
        freopen("lapte.in" , "r" , stdin );
        freopen("lapte.out" , "w" , stdout );
        scanf("%d%d" , &N , &L );
        for(int i = 1 ; i <= N ; ++i )
            scanf("%d%d" , &a[i] , &b[i] );
        int ls = 0 , ld = 101 , T ;
        while(ls +1 < ld )
        {
            T = (ls+ld)/2;
            memset(d, 0 , sizeof(d));
            memset(c,0,sizeof(c));
            memset(u,0,sizeof(u));
            for(int i = 0 ; i <= T/a[1] ; ++i )
            {
                d[1][i] = (T-a[1]*i)/b[1];
                u[1][i] = 1;
                c[1][i] = i;
            }
            for(int i = 2 ; i <= N ; ++i )
                for(int j = 0 ; j <= L ; ++j )
                {
                    maxx = -1;
                    nr = 0;
                    for(int k = 0 ; k <= j ; ++k )
                        if(a[i]*k <= T)
                    {
                            if(u[i-1][j-k] && (T-a[i]*k)/b[i] + d[i-1][j-k] > maxx)
                        {
                            maxx = (T-a[i]*k)/b[i] + d[i-1][j-k];
                            nr = k;
                        }
                        d[i][j] = maxx;
                        c[i][j] = nr;
                        if(maxx == -1)u[i][j] = 0;
                        else u[i][j] = 1;
                    }
                    else break;
                }
            if(d[N][L] >= L)
            {
                sol = T;
                int x = L;
                for(int i = N ; i ; i-- )
                {
                    cant[i] = c[i][x];
                    x -= c[i][x];
                }
                ld = T;
            }
            else ls = T;
        }
         printf("%d\n" , sol );
         for(int i = 1 ; i <= N ; ++i )
            {
                int x = (sol-cant[i]*a[i])/b[i];
                printf("%d %d\n" , cant[i] , x);
            }
         return 0;
    }