Cod sursa(job #329279)

Utilizator raduzerRadu Zernoveanu raduzer Data 5 iulie 2009 17:28:55
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAX_N = 102;
const int INF = 0x3f3f3f3f;

int n, m, sol;
int a[MAX_N], b[MAX_N];
int solx[MAX_N], soly[MAX_N];
int x[MAX_N], y[MAX_N];

void print(int a[])
{
	for (int i = 1; i <= n; ++i)
		printf("%d ", a[i]);
	printf("\n");
}

int check(int T)
{
	int d[MAX_N][MAX_N];
	int i, j, k;

	//T = 18;

	memset(d, 0, sizeof(d));
	memset(x, 0, sizeof(x));
	memset(y, 0, sizeof(y));
	
	for (i = 0; i <= m; ++i) d[0][i] = -INF;
	d[0][0] = 0;

	for (i = 1; i <= n; ++i)
		for (j = 0; j <= m; ++j)
			for (k = 0; k <= j && k * a[i] <= T; ++k)
				d[i][j] = max(d[i][j], d[i - 1][j - k] + (T - k * a[i]) / b[i]);

	i = n;
	j = m;

	while (i)
	{
		int r;
		for (k = 0; k <= j; ++k)
			if (d[i][j] == d[i - 1][j - k] + (T - k * a[i]) / b[i])
			{
				r = k;
				break;
			}

		x[i] = r;
		y[i] = (T - r * a[i]) / b[i];
		j -= r;
		--i;
	}

	/*print(x);
	print(y);
	printf("%d\n", d[n][m]);
	printf("\n");*/

	if (d[n][m] >= m) return 1;
	return 0;
}

void bin(int st, int dr)
{
	while (st <= dr)
	{
		int mij = (st + dr) >> 1;

		if (check(mij))
		{
			dr = mij - 1;
			sol = mij;
			memcpy(solx, x, sizeof(x));
			memcpy(soly, y, sizeof(y));

		//	printf("%d\n", mij);
		//	print(x);
		//	print(y);
		}
		else st = mij + 1;
	}
}

int main()
{
	int i;
	freopen("lapte.in", "r", stdin);
	freopen("lapte.out", "w", stdout);

	scanf("%d %d", &n, &m);

	for (i = 1; i <= n; ++i)
		scanf("%d %d", &a[i], &b[i]);

	bin(1, 10000);

	printf("%d\n", sol);

	for (i = 1; i <= n; ++i)
		printf("%d %d\n", solx[i], soly[i]);
}