Cod sursa(job #69426)

Utilizator crawlerPuni Andrei Paul crawler Data 2 iulie 2007 23:52:49
Problema Lapte Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>
#include <string>

using namespace std;

#define Nmax 128

int best[Nmax*2], a[Nmax], b[Nmax], n,l;
int use1[Nmax], use2[Nmax], use[Nmax][Nmax*2];

int good(int T)
{
	memset(use,0,sizeof(use));
	memset(best,-1,8*Nmax);	
	best[0] = 0;

       	#define comp(A,B) if (A<B) A = (B), use[i][j+k] = j;
       	// aka am baut j litri de A, si .. B
       
   	for (int i=1;i<=n;++i)
  	   for (int k=200;k>=0;--k) if (best[k] >= 0)
	      for(int j=T/a[i];j>=0;--j) if (j + k <= 200)
		   comp(best[j+k],((T-a[i]*j)/b[i])+best[k])

	for (int i=200;i>=l;--i)
		if(best[i] >= l)
			return i;
	return 0;	
}	

int main()
{
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);

	scanf("%d%d",&n,&l);

	int ret = 0;	

	for (int i=1;i<=n;++i)
		scanf("%d%d",a+i,b+i);
		
	int rec;
	
	#define pow(w) (1<<(w))
	#define Q(i) if ((rec = good(ret + pow(i))) == 0) ret += pow(i);
	Q(6) Q(5) Q(4) Q(3) Q(2) Q(1) Q(0)

	while(rec == 0) rec = good(++ret);

	for (int i=n;i>0;--i)
	{
		use1[i] = use[i][rec];
		use2[i] = (ret-use1[i]*a[i])/b[i];
		rec -= use1[i];	
	}

	printf("%d\n",ret);
	
	for (int i=1;i<=n;++i)
		printf("%d %d\n",use1[i],use2[i]);
		
	return 0;
}