Cod sursa(job #1058418)

Utilizator Athena99Anghel Anca Athena99 Data 15 decembrie 2013 15:16:22
Problema Lapte Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>

using namespace std;

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

const int inf= 1<<30;
const int nmax= 100;
const int xmax= nmax*nmax;

int n, l;

int ta[nmax+1], tb[nmax+1];
int a[nmax+1], b[nmax+1], d[nmax+1][nmax+1], p[nmax+1][nmax+1];

int check( int t ) {
    for ( int i= 0; i<=nmax; ++i ) {
        for ( int j= 0; j<=nmax; ++j ) {
            d[i][j]= -inf;
        }
    }

    d[0][0]= 0;
    for ( int i= 0; i<=n-1; ++i ) {
        for ( int j= 0; j<=l; ++j ) {
            for ( int k= 0; k<=l; ++k ) {
                if ( d[i][j]!=-inf && k*ta[i+1]<=t ) {
                    int x= (t-k*ta[i+1])/tb[i+1];
                    if ( d[i+1][j+k]<d[i][j]+x ) {
                        d[i+1][j+k]= d[i][j]+x;
                        p[i+1][j+k]= k;
                    }
                }
            }
        }
    }

    if ( d[n][l]>=l ) {
        return 1;
    } else {
        return 0;
    }
}

int main(  ) {
    fin>>n>>l;
    for ( int i= 1; i<=n; ++i ) {
        fin>>ta[i]>>tb[i];
    }

    int n2;
    for ( n2= 1; n2<= xmax; n2<<= 1 ) {
    }

    int sol= xmax;
    for ( int step= n2; step>0; step>>= 1 ) {
        if ( sol-step>=1 && check(sol-step)==1 ) {
            sol-= step;
        }
    }

    fout<<sol<<"\n";
    for ( int i= n; i>=1; l-= p[i][l], --i ) {
        a[i]= p[i][l];
        b[i]= (sol-ta[i]*a[i])/tb[i];
    }

    for ( int i= 1; i<=n; ++i ) {
        fout<<a[i]<<" "<<b[i]<<"\n";
    }

    return 0;
}