Cod sursa(job #1120563)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 25 februarie 2014 08:31:07
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
using namespace std;
int n, L, va[110], vb[110], sol, bestB[110][110], pred[110][110], A[110], B[110];

inline bool Posibil(int T)
{
	int i, j, k;
	for(i = 0; i <= n; ++i)
		for(j = 0; j <= L; ++j)
		{
			bestB[i][j] = -1000000000;
			pred[i][j] = 0;
		}
	bestB[0][0] = 0;
	for(i = 1; i <= n; ++i)
	{
		for(j = 0; j <= L; ++j)
		{
			for(k = 0; k <= j; ++k)
			{
				if(T - (j - k) * va[i] >= 0)
				{
					if(bestB[i][j] < bestB[i - 1][k] + (T - (j - k) * va[i]) / vb[i])
					{
						bestB[i][j] = bestB[i - 1][k] + (T - (j - k) * va[i]) / vb[i];
						pred[i][j] = k;
					}
				}
			}
		}
	}
	if(bestB[n][L] >= L)
		return true;
	return false;
}

inline void CautareBinara()
{
	int st, dr, mij;
	st = 1;
	dr = 100;
	while(st <= dr)
	{
		mij = (st + dr) / 2;
		if(Posibil(mij))
		{
			sol = mij;
			dr = mij - 1;
		}
		else
			st = mij + 1;
	}
}

int main()
{
	int i, j, k;
	ifstream fin("lapte.in");
	fin >> n >> L;
	for(i = 1; i <= n; ++i)
		fin >> va[i] >> vb[i];
	fin.close();
	
	CautareBinara();
	Posibil(sol);
	i = n;
	j = L;
	while(i)
	{
		k = pred[i][j];
		A[i] = j - k;
		B[i] = bestB[i][j] - bestB[i - 1][k];
		j = k;
		i--;
	}
	
	ofstream fout("lapte.out");
	fout << sol << "\n";
	for(i = 1; i <= n; ++i)
		fout << A[i] << ' ' << B[i] << "\n";
	fout.close();
	return 0;
}