Cod sursa(job #1435757)

Utilizator RaduToporanRadu Toporan RaduToporan Data 14 mai 2015 13:03:52
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#define nmax 105
using namespace std;
ifstream f("lapte.in"); ofstream g("lapte.out");
int n,L,dp[nmax][nmax],a[nmax],b[nmax],drum[nmax][nmax];
struct {int x,y;} rez[nmax];
bool verif(int T)
{   int i,j,k;
    for(i=0;i<=n;i++) for(j=1;j<=L;j++) dp[i][j]=-1, drum[i][j]=0;
    for(i=0;i<=n;i++) dp[i][0]=0, drum[i][0]=0;
    for(i=1;i<=n;i++)
    {   for(j=0;j<=L;j++)
        {   for(k=0;k<=T/a[i]&&k<=j;k++)
            {   if(dp[i-1][j-k]<0) continue;
                int cost_a=k*a[i];
                int litri_b=(T-cost_a)/b[i];
                if(dp[i][j]<dp[i-1][j-k]+litri_b)
                {   dp[i][j]=dp[i-1][j-k]+litri_b;
                    drum[i][j]=k;
                }
            }
        }
    }
    if(dp[n][L]>=L)
    {   int nr=L;
        for(i=n;i>=1;i--)
        {   rez[i].x=drum[i][nr];
            rez[i].y=(T-rez[i].x*a[i])/b[i];
            nr-=rez[i].x;
        }
        return 1;
    }
    return 0;
}
int rezolva()
{   int st=0,dr=105,sol=0;
    while(st<=dr)
    {   int mij=(st+dr)/2;
        if(verif(mij)) {sol=mij; dr=mij-1;} else st=mij+1;
    }
    return sol;
}
int main()
{   f>>n>>L;
    for(int i=1;i<=n;i++) f>>a[i]>>b[i];
    g<<rezolva()<<"\n";
    for(int i=1;i<=n;i++) g<<rez[i].x<<" "<<rez[i].y<<"\n";
    g.close(); return 0;
}