Cod sursa(job #1117464)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 23 februarie 2014 15:52:27
Problema Lapte Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <cstdio>
#define Nmax 105
#define INF 2000000000

using namespace std;

int N,L,dp[Nmax][Nmax];
struct om
{
    int a,b;
};
om v[Nmax],r[Nmax][Nmax],t[Nmax][Nmax],s[Nmax];

inline bool Ok(int T)
{
    int i,j,k;
    for(i=0;i<=N;++i)
        for(j=1;j<=L;++j)
            dp[i][j]=-INF;
    dp[0][0]=0;
    for(i=1;i<=N;++i)
        for(j=1;j<=L;++j)
            for(k=0;k<=j;++k)
                if(k*v[i].a<=T && dp[i-1][j-k]>=0 && dp[i][j]<dp[i-1][j-k]+(T-k*v[i].a)/v[i].b)
                {
                    dp[i][j]=dp[i-1][j-k]+(T-k*v[i].a)/v[i].b;
                    t[i][j].a=k;
                    t[i][j].b=(T-k*v[i].a)/v[i].b;
                }
    if(dp[N][L]>=L)
        return true;
    return false;
}

int main()
{
    freopen ("lapte.in","r",stdin);
    freopen ("lapte.out","w",stdout);
    int i,j,st=1,dr=100000000,mij,sol;
    scanf("%d%d", &N,&L);
    for(i=1;i<=N;++i)
        scanf("%d%d", &v[i].a,&v[i].b);
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(Ok(mij))
        {
            sol=mij;
            for(i=0;i<=N;++i)
                for(j=1;j<=L;++j)
                {
                    r[i][j].a=t[i][j].a;
                    r[i][j].b=t[i][j].b;
                }
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    printf("%d\n", sol);
    i=N; j=L;
    while(i>=0 && j>=0)
    {
        s[i].a=r[i][j].a; s[i].b=r[i][j].b;
        j-=s[i].a; --i;
    }
    for(i=1;i<=N;++i)
        printf("%d %d\n", s[i].a, s[i].b);
    return 0;
}