Cod sursa(job #645459)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 9 decembrie 2011 18:44:50
Problema Lapte Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<stdio.h>

#define maxdim 105

FILE*f=fopen("lapte.in","r");
FILE*g=fopen("lapte.out","w");

int n,l,i,p,m,u,crtbest = 1<<30;
int a[maxdim],b[maxdim],D[maxdim][maxdim],c1[maxdim][maxdim],c2[maxdim][maxdim],sol1[maxdim],sol2[maxdim];

inline bool posibil ( int T ){
	int i,j,ca,cb;
	
	for ( i = 1 ; i <= n ; ++i ){
		for ( j = 0 ; j <= l ; ++j ){
			D[i][j] = 0;
		}
	}
	D[0][0] = 1;
	
	for ( i = 0 ; i < n ; ++i ){
		for ( ca = 0 ; ca * a[i+1] <= T ; ++ca ){
			cb = (T - ca * a[i+1]) / b[i+1];
			for ( j = 0 ; j <= l ; ++j ){
				if ( D[i][j] ){
					if ( j + ca <= l ){
						if ( D[i+1][j+ca] < D[i][j] + cb ){
							D[i+1][j+ca] = D[i][j] + cb;
							c1[i+1][j+ca] = ca; c2[i+1][j+ca] = cb;
						}
					}
					else{
						if ( D[i+1][l] < D[i][j] + cb ){
							D[i+1][l] = D[i][j] + cb;
							c1[i+1][l] = ca; c2[i+1][l] = cb;
						}
					}
				}
			}
		}
	}
	
	if ( D[n][l] >= l ){
		if ( T < crtbest ){
			crtbest = T;
			int x,y; x = n; y = l;
			while ( x ){
				sol1[x] = c1[x][y]; sol2[x] = c2[x][y];
				y -= c1[x][y]; --x;
			}
		}
		return 1;
	}
	return 0;
}

int main () {
	
	fscanf(f,"%d %d",&n,&l); ++l;
	
	for ( i = 1 ; i <= n ; ++i ){
		fscanf(f,"%d %d",&a[i],&b[i]);
	}
	
	p = 1 ; u = 20000;
	
	while ( p <= u ){
		m = (p + u) >> 1;
		if ( posibil(m) ){
			u = m - 1;
		}
		else{
			p = m + 1;
		}
	}
	
	fprintf(g,"%d\n",p);
	for ( i = 1 ; i <= n ; ++i ){
		fprintf(g,"%d %d\n",sol1[i],sol2[i]);
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}