Cod sursa(job #1123186)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 25 februarie 2014 23:17:49
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <cstring>

#define DN 105
#define INF (1<<30)
using namespace std;

int dp[DN][DN],prec[DN][DN],n,l,A[DN],B[DN],cnt[DN];

bool check(int T){

    for(int i=0;i<=n;++i)
        for(int j=0;j<=l;++j){
            prec[i][j]=0;
            dp[i][j]= -INF;
        }

    /// dp[i][j] = pentru primii i , nr max de litri bauti din B daca am baut j litri din A
    dp[0][0]=0;

    for(int i=1;i<=n;++i){

        for(int j=0;j<=l;++j){

            for(int k=0;k<=j;++k){ /// am baut k litri din A si mai bem j-k

                if( T - (j-k)*A[i] >= 0)

                if( dp[i][j] < dp[i-1][k] + (T - (j-k)*A[i])/B[i] ){

                    dp[i][j] = dp[i-1][k] + (T - (j-k)*A[i])/B[i];
                    prec[i][j] = k;
                }
            }
        }
    }

    return dp[n][l] >= l;
}

int caut(){

    int st = 0 , dr = 100 , rez = -1;
    for(int mij=( (st+dr)>>1 ); st<=dr ; mij =( (st+dr)>>1 )){

        if(check(mij)){
            rez = mij;
            dr = mij - 1;
        }else
            st = mij + 1;
    }
    return rez;
}

int main()
{
    int rez;
    ifstream f("lapte.in");
    ofstream g("lapte.out");
    f>>n>>l;
    for(int i=1;i<=n;++i)
        f>>A[i]>>B[i];
    rez = caut();
    check(rez);

    for(int i=n,j=l,k ; i ;){

        k = prec[i][j];
        A[i] = j - k;
        B[i] = dp[i][j] - dp[i-1][k];
        j = k;
        --i;
    }
    g<<rez<<"\n";
    for(int i=1;i<=n;++i)
        g<<A[i]<<" "<<B[i]<<"\n";

    return 0;
}