Cod sursa(job #1236925)

Utilizator zacuscaAlex Iordache zacusca Data 2 octombrie 2014 19:59:08
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 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;
}