Cod sursa(job #810042)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 9 noiembrie 2012 15:01:57
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
using namespace std;

ifstream fi ("lapte.in");
ofstream fo ("lapte.out");

const int dim = 101;
int N, L;
int VA[dim], VB[dim];
int bestm, D[dim][dim], T[dim][dim];

void cit ()
{
	fi >> N >> L;
	for (int i = 1; i <= N; i++)
	{
		fi >> VA[i] >> VB[i];
	}
}

int din (int t)
{
	int n, a, a1, a2, d;
	for (a = 0; a <= L; a++)
	{
		D[1][a] = (t - a * VA[1]) / VB[1];
	}
	for (n = 2; n <= N; n++)
	{
		for (a2 = 0; a2 <= L; a2++)
		{
			D[n][a2] = 0;
			T[n][a2] = 0;
			for (a1 = 0; a1 <= a2; a1++)
			{
				a = a2 - a1;
				if (t > a * VA[n])
				{
					d = D[n-1][a1] + (t - a * VA[n]) / VB[n];
					if (D[n][a2] < d)
					{
						D[n][a2] = d;
						T[n][a2] = a1;
					}
				}
			}
		}
	}
	if (D[N][L] >= L)
		return 1;
	return 0;
}

void cauta ()
{
	int p = 0, u = dim, t;
	while (p <= u)
	{
		t = (p + u) >> 1;
		if (din (t))
			u = t - 1;
		else
			p = t + 1; 
	}
	bestm = p;
	din (bestm);
}

void afi (int n, int a)
{
	if (n == 0)
	{
		fo << bestm << '\n';
		return;
	}
	afi (n-1, T[n][a]);
	fo << a - T[n][a] << ' '  << D[n][a] - D[n-1][T[n][a]] << '\n';
}

int main ()
{
	cit ();
	cauta ();
	afi (N, L);
	
	return 0;
}