Cod sursa(job #566570)

Utilizator EduardLEduard Luca EduardL Data 29 martie 2011 10:11:33
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
# include<fstream>
# include<string.h>
using namespace std;

# define  maxn  102

ifstream f("lapte.in");
ofstream g("lapte.out");

int ca[maxn], cb[maxn], n, l, best[maxn][maxn], from[maxn][maxn], last[maxn][maxn];
int sol;


void citire()
{
	int i; f>>n>>l;
	for (i=1; i<=n; i++)
		 f>>ca[i]>>cb[i];
}

int max(int a, int b)
{
	if(a>b) return a;
	return b;
}
int min(int a, int b)
{
	if(a<b) return a;
	return b;
}

int	verific(int t)
{
	int i, j, qa, maxa, aux;

	memset(best, 0xff, sizeof(best));
	for (maxa=t/ca[1], i=0; i<=maxa; i++)
		best[1][i] = ( t - i*ca[1] ) / cb[1];
	for (i=2; i<=n; i++)
		for (qa=0; qa <= l; qa++)
		{
			for (j=0, maxa = min(qa, t/ca[i]); j<=maxa; j++)
				if ( best[i-1][qa-j] != -1 )
				if ( (aux=best[i-1][qa-j] + ( t-j*ca[i] ) / cb[i] ) > best[i][qa] )
					best[i][qa] = aux, from[i][qa] = qa-j;
		}
		
	return ( best[n][l] >= l );
}

void rezolva()
{
	int mina, minb, tmax, t, step, i;
	
	for (mina=ca[1], minb=cb[1], i=2; i<=n; i++)
		 mina = ca[i] < mina ? ca[i] : mina,
		 minb = cb[i] < minb ? cb[i] : minb;
		 
	tmax = l * mina + l * minb;
	
	for (step=1; step<tmax; step<<=1);

	for (t=tmax; step; step>>=1)
		if ( t - step >= 1 )
			if ( verific(t - step) )
				t -= step,
				memcpy(last, from, sizeof(from));
				
	sol = t,
	memcpy(from, last, sizeof(last));
}

void afisare()
{
	int i, act, total=l;
	int q[maxn][2];
	memset(q, 0, sizeof(q));
	for (i=n, act=from[n][l]; i>=1; i--)
		q[i][0] = total-act,
		total = act,
		q[i][1] = ( sol-q[i][0] * ca[i] ) / cb[i],
		act = from[i-1][act];
	g<<sol<<'\n';
	for (i=1; i<=n; i++)
	    g<<q[i][0]<<' '<<q[i][1]<<'\n';
}

int main()
{
	citire();
	rezolva();
	afisare();
	
	return 0;
}