Cod sursa(job #69253)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 2 iulie 2007 02:14:57
Problema Lapte Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <cstdio>
#define fin  "lapte.in"
#define fout "lapte.out"
#define Nmax 201

using namespace std;

int N,L,bst[Nmax][3*Nmax],cant[Nmax][3*Nmax],t[Nmax][3*Nmax],viz[Nmax][3*Nmax];	
int v[Nmax][2];
int sol[Nmax][2],st;

int go(int lim) {
int i,j,k,a,b;	
	
	for (i=0;i<=L;++i) 
	for (j=0;j<=3*L;++j)
		bst[i][j]=t[i][j]=viz[i][j]=0;
		
	for (i=1;i<=N;++i) {
		for (j=0;j*v[i][0] <= lim;++j) {
			a=j;
			b=(lim-j*v[i][0])/v[i][1];
			for (k=3*L;k>=0;--k) 
				if ( viz[i-1][k] && k+a<=2*L && bst[i-1][k]+b >= bst[i][k+a]) {
					viz[i][k+a]=1;
					bst[i][k+a]=bst[i-1][k]+b;
					cant[i][k+a]=a; t[i][k+a]=i-1;
				}
			if (bst[i][a] < b || !viz[i][a]) {
				bst[i][a]=b;
				cant[i][a]=a; t[i][a]=0;
				viz[i][a]=1; 
			}
		}

		for (j=0;j<=3*L;++j)
			if ( bst[i-1][j] > bst[i][j] || ( !viz[i][j] && viz[i-1][j]) ) {
				viz[i][j]=1;
				bst[i][j]=bst[i-1][j]; t[i][j]=t[i-1][j];
				cant[i][j]=cant[i-1][j];
			}

	}

	for (i=3*L;i>=L;--i)
		if (viz[N][i] && bst[N][i] >= L) {
			st=i;
			return 1;
		}

	return 0;
}

int main() {
int i,m,lo,hi,x;
	freopen(fin,"r",stdin); freopen(fout,"w",stdout);

	scanf("%d%d",&N,&L);

	for (i=1;i<=N;++i)
		scanf("%d%d",&v[i][0],&v[i][1]);
	
	lo=1; hi=Nmax;

	while (lo<=hi) {
		m=(lo+hi)/2;
		if ( !go(m) )
			lo=m+1;
		else
			hi=m-1;
	}

	printf("%d\n",lo);
	
	i=N; go(lo);

	while (i>0) {
		x=cant[i][st];
		sol[i][0]=x;
		sol[i][1]=(lo-x*v[i][0])/v[i][1];
		st-=x;
		i=t[i][st];
	}
	
	for (i=1;i<=N;++i)
		printf("%d %d\n",sol[i][0],sol[i][1]);
	
	return 0;
}