Cod sursa(job #1234755)

Utilizator enedumitruene dumitru enedumitru Data 27 septembrie 2014 22:34:10
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 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;
    // dp[i][j] = k;
    // k = nr de litri bauti de tipul B in timpul T, avand j litri de tipul A si folosind primii i concurenti
    for(i=1;i<=n;i++)	//i-au fiecare concurent
	{   for(j=0;j<=L;j++)	//pentru fiecare cantitate de lapte de tipul A
		{   for(k=0;k<=T/a[i]&&k<=j;k++)	//incerc sa continuu fiecare rezultat anterior
			{   if(dp[i-1][j-k]<0) continue;
                int cost_a=k*a[i];	//timpul pentru a avea k litri de tipul A;
                int litri_b=(T-cost_a)/b[i];	//cati litri de tipul B poate sa bea al-i-lea concurent
                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;
}