Cod sursa(job #604958)

Utilizator CristibaluCristi B Cristibalu Data 26 iulie 2011 11:20:37
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <cstdio>
FILE *f,*g;

int n,l,i,mn=99999999;
int mx[110][110],ax[110][110];
struct cp{int a,b;} ;
cp v[110];


int ok(int t) ;
void caut(int i, int j) {
int m;

if (i<=j) {
	m=(i+j)/2;
	if (ok(m)) {
		if (mn>m) {
			mn=m;
			}
		caut(i,m-1);
		}
	else {
		caut(m+1,j);
		}
	}

}

int ok(int t) {
int i,j,q;

for (i=0;i<=n;i++)
	for (j=0;j<=l;j++)
		mx[i][j]=-1;

mx[0][0]=0;
for (i=1;i<=n;i++)
	for(j=0;j<=l;j++)
		for (q=0;q<=t/v[i].a && q<=j;q++) 
			if (mx[i-1][j-q]!=-1 && mx[i-1][j-q]+(t-q*v[i].a)/v[i].b > mx[i][j])  {
				mx[i][j] = mx[i-1][j-q]+(t-q*v[i].a)/v[i].b;
				ax[i][j] = j-q;
				}

if (mx[n][l]>=l) 
	return 1;
else 
	return 0;
}	

void rec(int i,int j) {

if (i>1)
	rec(i-1,ax[i][j]);
fprintf(g,"%d %d\n",j-ax[i][j],mx[i][j]-mx[i-1][ax[i][j]]);
}

int main() {
f=fopen("lapte.in","r");
g=fopen("lapte.out","w");

fscanf(f,"%d%d",&n,&l);

for (i=1;i<=n;i++) {
	fscanf(f,"%d%d",&v[i].a,&v[i].b);
	}

caut(1,100);

i=ok(mn);
fprintf(g,"%d\n",mn);
rec(n,l);

fclose(g);
return 0;
}