Cod sursa(job #980783)

Utilizator Kira96Denis Mita Kira96 Data 5 august 2013 16:38:57
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include<fstream>
#define N 105
#define inf -(1<<28)
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int D[N][N],a[N],b[N],A[N][N],B[N][N],sol1[N],sol2[N],st,dr,mij,j,i,l,ca,cb,n,sol,x,y;
int check(int T)
{
	for(i=0;i<=n;++i)
		for(j=0;j<=l;++j)
			D[i][j]=inf;
	D[0][0]=0;
	for(i=1;i<=n;++i)
		for(ca=0;ca*a[i]<=T;++ca)
		{
			cb=(T-ca*a[i])/b[i];
			for(j=0;j<=l;++j)
			if(j+ca<=l)
			{
				if(D[i][j+ca]<D[i-1][j]+cb)
				{
					D[i][j+ca]=D[i-1][j]+cb;
					A[i][j+ca]=ca; B[i][j+ca]=cb;
				}
			}
			else
				if(D[i][l]<D[i-1][j]+cb)
				{
					D[i][l]=D[i-1][j]+cb;
					A[i][l]=ca; B[i][l]=cb;
				}
		}
	if(D[n][l]>=l)
	{
		x=n; y=l;
		while(x)
		{
			sol1[x]=A[x][y]; sol2[x]=B[x][y];
			y-=A[x][y]; x--;
		}
		return 1;
	}
	return 0;
}
int main ()
{
	f>>n>>l;
	for(i=1;i<=n;++i)
		f>>a[i]>>b[i];
	st=1;
	dr=100;
	while(st<=dr)
	{
		mij=(st+dr)>>1;
		if(check(mij))
		{
			dr=mij-1;
			sol=mij;
		}
		else
			st=mij+1;
	}
	g<<sol<<"\n";
	for(i=1;i<=n;++i)
		g<<sol1[i]<<" "<<sol2[i]<<"\n";
	return 0;
}