Cod sursa(job #1316308)

Utilizator gedicaAlpaca Gedit gedica Data 13 ianuarie 2015 18:28:52
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<fstream>

using namespace std;

const int NMAX= 100, inf= ( 1<<30 );

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

struct milk
{
    int a, b;
};

milk v[NMAX+1];
int N, L, ans, d[NMAX+1][NMAX+1], mrasp[NMAX+1][NMAX+1], vrasp[NMAX+1];

bool verificare( int x )
{
    for( int i = 0; i<=N; ++i )
    {
       for( int j = 0; j<=L; ++j )
       {
           d[i][j] = -inf;
       }
    }

    d[0][0] = 0;

    for( int i = 1; i<=N; ++i )
    {
        for( int j = 0; j<=L; ++j )
        {
            for( int k = 0; k<=j && k * v[i].a<=x; k++)
            {
                int aux = ( x - k * v[i].a ) / v[i].b;

                if( d[i][j]<d[i - 1][j - k] + aux )
                {
                    d[i][j] = d[i - 1][j - k] + aux;
                    mrasp[i][j] = k;
                }
            }
        }
    }

    if( d[N][L]>=L )
        return 1;
    else
        return 0;
}

int caut_binar()
{
    int hi = NMAX+1, lo = -1, mid;

    while(hi - lo>1)
    {
        mid = (hi + lo) / 2;

        if( verificare(mid)==1 && verificare(mid - 1)==0 )
            return mid;

        if( verificare(mid)==1 )
            hi = mid;
        else
            lo = mid;
    }

    if (verificare(mid)==1 && verificare(mid - 1)==0 )
            return mid;
    if( verificare(hi)==1 && verificare(hi - 1)==0 )
            return hi;
    if( verificare(lo)==1 && verificare(lo - 1)==0 )
            return lo;
    return 0;
}

int main()
{
    in >> N >> L;

    for( int i = 1; i<=N; ++i )
    {
        in >> v[i].a >> v[i].b;
    }

    ans = caut_binar();

    verificare(ans);

    out << ans << '\n';

    int aux = N;

    while( aux!=0 )
    {
        vrasp[aux] = mrasp[aux][L];
        L -= mrasp[aux][L];
        --aux;
    }

    for( int i= 1; i<=N; ++i )
    {
        out << vrasp[i] << ' ' << ( ans - vrasp[i] * v[i].a ) / v[i].b << '\n';
    }

    return 0;
}