Cod sursa(job #216667)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 25 octombrie 2008 09:47:22
Problema Lapte Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int n, l, b[101], a[101], c[101][101];
typedef struct
{
	int y, a, b;
} Laptar;
Laptar r[101][101];

int min(int x, int y) { return x < y ? x : y;}
int max(int x, int y) { return x > y ? x : y;}

void citire()
{
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	scanf("%d %d", &n, &l);
	int i;
	for (i=1; i<=n; i++)
		scanf("%d %d",&a[i], &b[i]);		
}

int verif(int T)
{
	int i, j, k;
	
	j = 0;
	for (i = 0; i <= n; i++)
		for (j = 0; j <= l; j++) c[i][j] = 0;

	for (i = 1; i <= n; i++)
		for (j = 0; j <= l; j++)
		{
			int maxim = 0;
			for (k = 0; ((k * a[i]) <= T) && ((j - k) >= 0); k++)
				if (maxim <= c[i - 1][j - k] + (T - a[i] * k) / b[i])
				{
					maxim = c[i - 1][j - k] + (T - a[i] * k) / b[i];
					r[i][j].y = j - k;
					r[i][j].a = k;
					r[i][j].b = (T - a[i] * k) / b[i];
				}
					
			c[i][j] = maxim;			
		}
	if (c[n][l] >= l) return 1;
	return 0;
}

int search()
{
	int p, u, m, ok1, ok2;
	p = 1; u = 100;
	while (p <= u)
	{
		m = (p + u) / 2;
		ok1 = verif(m);
		ok2 = verif(m - 1);
		if (ok1 && !ok2) return m;
		else if (ok2) u = m - 1;
		else if (!ok1) p = m + 1;
	}
	return 0;
}

void reconst(int x, int y)
{
	if (x > 0)
	{
		reconst(x - 1, r[x][y].y);
		printf("%d %d\n",r[x][y].a, r[x][y].b);
	}
}

int main()
{
	citire();

	int rez = search();
	verif(rez);
	printf("%d\n",rez);

	reconst(n,l);
	return 0;
}