Cod sursa(job #462648)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 12 iunie 2010 15:32:09
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
/*sortez dupa raportul vitezelor de baut (cat de predispusi sunt sa
bea un tip de lapte) si apoi ii pun sa bea in ordine din laptele A,
dupa ce se termina din B. Vad la sfarsit daca pot termina intr-un
interval de timp dat (cautarea binara a raspunsului).*/

#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 101;

struct bautor
{
	int A,B;
};

bautor viteza[N],bea[N];
int n,l;

void citire()
{
	scanf("%i%i",&n,&l);
	for (int i = 1; i <= n; ++i)
		scanf("%i%i",&viteza[i].A,&viteza[i].B);
}

bool ordine_buna(bautor x, bautor y)
{
	if (x.A * y.B <= y.A * x.B)
		return true;
	return false;
}

bool posibil(int t)
{
	int lapte_A = l;
	int lapte_B = l;
	for (int i = 1; i <= n; ++i)
		if (lapte_A > 0)
			if (t/viteza[i].A <= lapte_A)//bea doar lapte A
			{
				bea[i].A = t/viteza[i].A;
				bea[i].B = 0;
				lapte_A -= t/viteza[i].A;
			}
			else//bea ambele
			{
				bea[i].B = (t-lapte_A*viteza[i].A)/viteza[i].B;
				lapte_B -= (t-lapte_A*viteza[i].A)/viteza[i].B;
				bea[i].A = lapte_A;
				lapte_A = 0;
			}
		else//bea doar lapte B
		{
			bea[i].B = t/viteza[i].B;
			lapte_B -= t/viteza[i].B;
		}
	return (lapte_A <= 0)&&(lapte_B <= 0);
}

void cautare_binara_solutie()
{
	int cifra = 1<<8;
	int solutie = 0;
	while (cifra > 0)
	{
		if (!posibil(solutie+cifra))
			solutie += cifra;
		cifra /= 2;
	}
	printf("%i\n",1+solutie);
	posibil(1+solutie);
	for (int i = 1; i <= n; ++i)
		printf("%i %i\n",bea[i].A,bea[i].B);
}

int main()
{
	int solutie();
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	citire();
	sort(viteza+1,viteza+n+1,ordine_buna);
	cautare_binara_solutie();
	return 0;
}