Cod sursa(job #1027426)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 12 noiembrie 2013 19:40:52
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
#include <iostream>
#include <algorithm>

using namespace std;

ifstream input("lapte.in");
ofstream output("lapte.out");

int N , L , T;
pair<int,int> vect[200];

bool cmp(const pair<int,int> & a , const pair<int,int> & b)
{
	return (double(a.first)/double(a.second)) < ((double(b.first)/double(b.second)));
}


int main()
{
	input >> N >> L;
	for (int i = 0;i<N;i++)
		input >> vect[i].first >> vect[i].second;

	int left = 1;
	int right = 100;

	sort(vect , vect + N , cmp);

	int min_time = 1000;
	pair<int,int> raspuns[200];

	while (left <= right)
	{

		int middle = (left + right) >> 1;
		pair<int,int> lapte[200];

		int LA = L;
		int LB = L;
		int i = 0;

		for (i = 0;i<N;i++)
		{

			int lapte_auxA = middle / vect[i].first;
			int lapte_auxB = middle / vect[i].second;

			if (LA >= lapte_auxA)
			{
				LA -= lapte_auxA;
				lapte[i] = pair<int,int>(lapte_auxA , 0);
			}
			else if (LA > 0)
			{
			    int timpA = LA * vect[i].first;
			    int timpB = middle - timpA;
				lapte[i] = pair<int,int>(LA , timpB / vect[i].second);
				LB -= lapte[i].second;
				LA = 0;
			}
			else if (LB >= lapte_auxB)
			{
				LB -= lapte_auxB;
				lapte[i] = pair<int,int>(0 , lapte_auxB);
			}
			else if (LB > 0)
			{
				lapte[i] = pair<int,int>(0 , LB);
				LB = 0;
				break;
			}
			else
			{
			    LB = 0;
			    break;
			}
		}

		if (LB == 0 && LA == 0)
		{
			right = middle - 1;
			if (middle < min_time)
			{
				min_time = middle;
				for (int i = 0;i<N;i++)
					raspuns[i] = lapte[i];
			}

		}
		else if (LB != 0 || LA != 0)
		{
			left = middle + 1;
		}
	}

	output << min_time << "\n";
	for (int i = 0;i<N;i++)
	output << raspuns[i].first << " " << raspuns[i].second << "\n";

	return 0;
}