Cod sursa(job #1250148)

Utilizator felixiPuscasu Felix felixi Data 27 octombrie 2014 20:36:01
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

ifstream in("lapte.in");
ofstream out("lapte.out");

const int NMAX = 100;
const int INF  = (1<<30);

struct PAIR{
    int x,y;
};

vector <PAIR> sol;
int N, T, L, a[NMAX+3], b[NMAX+3];
int d[NMAX+3][NMAX+3], X[NMAX+3][NMAX+3];

void Dinamica( int timp ) {
    memset( d, 0, sizeof(d) );
    memset( X, 0, sizeof(X) );
    for( int i= 1;  i<=L;  ++i )  d[0][i]= -INF;

    for( int i= 1;  i<=N;  ++i ) {
        for( int j= 0;  j<=L;  ++j ) {
            X[i][j] = 0;
            d[i][j] = d[i-1][j] + timp/b[i];

            for( int K= 0;  K<=timp/a[i] && K<=j;  ++K ) {
                if( d[i][j] < d[i-1][j-K] + (timp - K*a[i])/b[i] ) {
                    d[i][j]= d[i-1][j-K] + (timp - K*a[i])/b[i];
                    X[i][j]= K;
                }
            }
        }
    }
}


int Bin_Search() {
    int st= 1, dr= L*(a[1]+b[1]);
    int last= dr;
    while( st<=dr ) {
        int mid= (st+dr)/2;
        Dinamica( mid );
        if( d[N][L] >= L ) {
            last= mid;
            dr= mid-1;
        }
        else {
            st= mid+1;
        }
    }
    return last;
}


int main() {
    in >> N >> L;
    for( int i= 1;  i<=N;  ++i ) {
        in >> a[i] >> b[i];
    }
    T= Bin_Search();
    Dinamica( T );

    out << T << '\n';
    ///   Reconstruction
    int S= L;
    for( int i= N;  i>=1;  --i ) {
        PAIR aux;
        aux.x = X[i][S];
        aux.y = ( T - X[i][S]*a[i] ) / b[i];
        sol.push_back( aux );
        S-= X[i][S];
    }
    for( int i= (int)sol.size()-1;  i>=0;  --i ) {
        out << sol[i].x << ' ' << sol[i].y << '\n';
    }

    return 0;
}