Cod sursa(job #474618)

Utilizator mihai995mihai995 mihai995 Data 4 august 2010 14:01:49
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
using namespace std;

int v[1<<7][1<<7];
int n,l,a[1<<7],b[1<<7];

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

bool ok(int x)
{
	int i,j,k,q;
	for (i=0;i<=100;i++)
		for (j=0;j<=100;j++)
			v[i][j]=-1;
	for (i=x/a[1];i>=0;i--)
		v[1][i]=(x-a[1]*i)/b[1];
	for (i=2;i<=n;i++)
		for (j=x/a[i];j>=0;j--)
		{
			q=(x-a[i]*j)/b[i];
			for (k=0;k<=100-j;k++)
				if (v[i-1][k]!=-1)
				{
					v[i][k]=max(v[i][k],v[i-1][k]);
					v[i][k+j]=max(v[i][j+k],q+v[i-1][k]);
				}
		}
	for (i=l;i<=100;i++)
		if (v[n][i]>=l)
			return true;
	return false;
}

int bsearch()
{
	int i,step=1<<6;
	for (i=0;step;step>>=1)
		if (!ok(i+step))
			i+=step;
	return i+1;
}

void redo(int x,int y,int t)
{
	int i,q;
	if (!x)
		return;
	if (x==1)
	{
		out<<y<<" "<<v[1][y]<<"\n";
		return;
	}
	for (i=t/a[x];i>=0;i--)
	{
		q=(t-a[x]*i)/b[x];
		if (y>=i && v[x-1][y-i]!=-1 && v[x][y]-v[x-1][y-i]==q)
		{
			redo(x-1,y-i,t);
			out<<i<<" "<<q<<"\n";
			return;
		}
	}
}

int main()
{
	int i,j,q,k,x;
	in>>n>>l;
	for (i=1;i<=n;i++)
		in>>a[i]>>b[i];
	x=bsearch();
	for (i=0;i<=100;i++)
		for (j=0;j<=100;j++)
			v[i][j]=-1;
	for (i=x/a[1];i>=0;i--)
		v[1][i]=(x-a[1]*i)/b[1];
	for (i=2;i<=n;i++)
		for (j=x/a[i];j>=0;j--)
		{
			q=(x-a[i]*j)/b[i];
			for (k=0;k<=100-j;k++)
				if (v[i-1][k]!=-1)
				{
					v[i][k]=max(v[i][k],v[i-1][k]);
					v[i][k+j]=max(v[i][j+k],q+v[i-1][k]);
				}
		}
	out<<x<<"\n";
	for (i=l;i<=100;i++)
		if (v[n][i]>=l)
		{
			redo(n,i,x);
			break;
		}
	return 0;
}