Cod sursa(job #176860)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 11 aprilie 2008 20:34:28
Problema Lapte Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

const int N_MAX = 110;

int N, L;

struct bla {
	int A, B;
} v[N_MAX], sol[N_MAX];

struct rap {
	double r;
	int ind;
} sor[N_MAX];

int cmp(rap a, rap b)
{
	return (a.r < b.r);
}

int merge(int timp)
{
	memset(sol, 0, sizeof(sol));

	int canta = 0, cantb = 0, rama, ramb, poz;
	for (int i = 1; i <= N; i ++) {

		poz = sor[i].ind;

		rama = L - canta;
		ramb = L - cantb;

		if (rama > 0) {
			sol[poz].A = timp / v[poz].A;
			if (sol[poz].A > rama) sol[poz].A = rama;
			else rama -= sol[poz].A;
			canta += sol[poz].A;
		}

		if (ramb > 0) {
			sol[poz].B = (timp - (sol[poz].A * v[poz].A)) / v[poz].B;
			if (sol[poz].B > ramb) sol[poz].B = ramb;
			else ramb -= sol[poz].B;
			cantb += sol[poz].B;
		}
	}

	if (canta >= L && cantb >= L) return 1;
	return 0;
}

int bs()
{
	int i, step;

	for (step = 1; step < 100; step <<= 1);
	for (i = 0; step; step >>= 1) {
		if (i + step <= 100 && !merge(i + step)) i += step;
	}

	return i;
}

int main()
{
	freopen("lapte.in", "r", stdin);
#ifndef _SCREEN_
	freopen("lapte.out", "w", stdout);
#endif

	scanf("%d %d\n", &N, &L);
	for (int i = 1; i <= N; i ++) {
		scanf("%d %d\n", &v[i].A, &v[i].B);
		sor[i].r = (double) v[i].A / (double) v[i].B;
		sor[i].ind = i;
	}

	sort(sor + 1, sor + N + 1, cmp);

	int T = bs() + 1;
	printf("%d\n", T);

	merge(T);
	for (int i = 1; i <= N; i ++) {
		printf("%d %d\n", sol[i].A, sol[i].B);
	}

	return 0;
}