Cod sursa(job #177821)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 13 aprilie 2008 17:20:04
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define maxl 201

long L, n, sal[maxl + 1][maxl + 1], v[101][2], last[101][maxl + 1][maxl + 1][2], sool[101][2];

void show(long a, long b, long c) {
	long i;
	while(c > 0) {
		sool[c][0] = last[c][a][b][0];
		sool[c][1] = last[c][a][b][1];
		a = a - sool[c][0];
		b = b - sool[c][1];
		--c;
	}
	for (i = 1;i <= n; ++i) {
		printf("%ld %ld\n", sool[i][0], sool[i][1]);
	}
}

long sol(long a, long b) {
	long i, k, j, l;
	memset(sal, 0, sizeof(sal));
	sal[0][0] = 1;
	for (k = 1; k <= n; ++k) {
		for (i = L + 10;i >= 0; --i) {
			for(j = L + 10;j >= 0; --j) {
				if(sal[i][j]) {
					long st  =0;
					long dr = a / v[k][0];
					if (i >= L) {
						dr = 0;
					}
					if (j >= L) {
						st = dr;
					}
					for (l = st; l <= dr; ++l) {
						sal[i + l][j + (a - l * v[k][0]) / v[k][1]] = 1;
						last[k][i + l][j + (a - l * v[k][0]) / v[k][1]][0] = l;
						last[k][i + l][j + (a - l * v[k][0]) / v[k][1]][1] = (a - l * v[k][0]) / v[k][1];
						if (i + l >= L && j + (a - l * v[k][0]) / v[k][1] >= L) {
							if(b==0) {
								return 1;
							} else {
								show(i + l,j + (a - l * v[k][0]) / v[k][1], k);
								return 1;
							}
						}
					}
				}
			}	
		}
	}
	return 0;
}

long cautab(long a, long b) {
	if (a == b) {
		return a;
	}
	long mij = (a + b) / 2;
	if (sol(mij, 0)) {
		return cautab(a, mij);
	} else {
		return cautab(mij + 1, b);
	}
}



int main() {
	long x, i;
	
	freopen("lapte.in","rt",stdin);
	freopen("lapte.out","wt",stdout);
	
	scanf("%ld %ld", &n, &L);
	for (i = 1;i <= n; ++i) {
		scanf("%ld %ld", &v[i][0], &v[i][1]);
	}
	x = cautab(1, 20);
	printf("%ld\n", x);
	sol(x, 1);
	return 0;
}