Cod sursa(job #1027401)

Utilizator andreivFMI - vacaroiu andrei andreiv Data 12 noiembrie 2013 19:22:55
Problema Lapte Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <cstdio>
#include <algorithm>
using namespace std;

struct betiv
{
	int C1, C2, poz;
}
v[109];

int cmp(const betiv &A, const betiv &B)
{
	if (A.C1 * B.C2 != A.C2 * B.C1)
		return A.C1 * B.C2 < A.C2 * B.C1;
	return A.C1 < B.C1;
}

int cmp_pt_afisare(const betiv &A, const betiv &B)
{
	return A.poz < B.poz;
}

int main()
{
	int n, lLapte, sol = -1;
	
	freopen("lapte.in","r", stdin);
	freopen("lapte.out", "w", stdout);
	scanf("%d %d", &n, &lLapte);
	for (int i=1; i<=n; ++i)
	{
		scanf("%d %d", &v[i].C1, &v[i].C2);
		v[i].poz = i;
	}
	
	sort(v+1, v+n+1, cmp);
	
	int x=1, y = 100 * lLapte * 100;
	while (x <= y)
	{
		int z = (x+y) / 2, time_used[109], LapteA = lLapte, LapteB = lLapte;
		for (int i = 1; i <= n; ++i)
		{
			int fol = min(LapteA, z/v[i].C1);
			LapteA -= fol;
			time_used[i] = fol * v[i].C1;
		}
		for (int i = n; i > 0 && LapteB > 0; --i)
			LapteB -= (z - time_used[i]) / v[i].C2;
		
		if (LapteA < 1 && LapteB < 1)
			sol = z, y = z-1; 
		else
			x = z + 1;
	}
	printf("%d\n", sol);
	//reconstitui solutia
	{
		int time_used[109], LapteA = lLapte, LapteB = lLapte;
		for (int i = 1; i <= n; ++i)
		{
			int fol = min(LapteA, sol / v[i].C1);
			LapteA -= fol;
			time_used[i] = fol * v[i].C1;
			v[i].C1 = fol;
		}
		for (int i = n; i > 0; --i)
		{
			int fol = min(LapteB, (sol - time_used[i]) / v[i].C2);
			LapteB -=  fol;
			v[i].C2 = fol;
		}
		
	}
	sort(v+1, v+n+1, cmp_pt_afisare);
	for (int i = 1; i <= n; ++i)
		printf("%d %d\n", v[i].C1, v[i].C2);
	
return 0; 
}