Cod sursa(job #1992916)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 21 iunie 2017 20:35:38
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include<fstream>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
int n,p,a[101],b[101],st,dr,mid,d[101][101],k,l,j,i,ra[101],rb[101];
int main(){
    in >> n >> l;
    for( i = 1; i <= n; i ++ ){
        in >> a[i] >> b[i];
    }
    for( st = 1, dr = 100000; st <= dr; ){
        mid = (st +dr )/2;
        for( i = 0; i <= n; i ++ ){
            for( j = 0; j <= l; j ++ ){
                d[i][j] = -1e8;
            }
         }
        d[0][0] = 0;
        for( i = 1; i <= n; i ++ ){
            for( j = 0; j <= l; j ++ ){
                for( k = 0; k <= min( j , mid / a[i] ); k ++ ){
                    d[i][j] = max( d[i][j], d[i-1][j-k] + (mid -a[i]*k)/b[i] );
                }
            }
        }

        if( d[n][l] < l ){
            st = mid + 1;
        }
        else{
            dr = mid - 1;
        }
    }
    out<<st<<"\n";
    for( i = 0; i <= n; i ++ ){
        for( j = 0; j <= l; j ++ ){
            d[i][j] = -1e8;
        }
    }
    d[0][0] = 0;
    for( i = 1; i <= n; i ++ ){
        for( j = 0; j <= l; j ++ ){
            for( k = 0; k <= min( j , st / a[i] ); k ++ ){
                d[i][j] = max( d[i][j], d[i-1][j-k] + (st -a[i]*k)/b[i] );
            }
        }
    }
    j = l;
    for( i = n; i >= 1; i -- ){
        for( k = 0; k <= min( j, st/a[i] ); k ++ ){
            if(d[i-1][j - k] + (st - a[i]*k)/b[i] == d[i][j] ){
                ra[i] = k;
                rb[i] = (st - a[i]*k)/b[i];
                j = j - k;
                break;
            }
        }
    }
    for( i = 1; i <= n; i ++ ){
        out << ra[i] <<" "<< rb[i]<<"\n";
    }
    return 0;
}