Cod sursa(job #2051570)

Utilizator shantih1Alex S Hill shantih1 Data 29 octombrie 2017 11:17:09
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <fstream>
#include <fstream>

using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");

int n, l, i, j, k, t, nr, mx, in, v[110][110], p[110][110];
int st, dr, mid, x, y, r[110], rz;

struct lapte
{	int a, b;	} a[110];

bool timp (int t)
{
	bool r = 0;

	for (int j = 0; j <= l; j++)
	{
		v[1][j] = (t-j*a[1].a)/a[1].b;	
		if (v[1][j] < 0)	v[1][j] = 0;
	}
	for (int i = 2; i <= n; i++)
	{
		v[i][0] = v[i-1][0] + t/a[i].b;
		for (j = 1; j <= l; j++)
		{
			mx = -l;
			for (int k = 0; k <= j; k++)
			{
				nr = (t-k*a[i].a)/a[i].b + v[i-1][j-k];
				if (nr > mx && t >= k*a[i].a)
					mx = nr;	
			}
			if (mx != -l)	v[i][j] = mx;
		}
	}
	
	if (v[n][l] >= l)	r = 1;
	return r;
}

int main () {
	
	fin >> n >> l;
	for (i = 1; i <= n; i++)
		fin >> a[i].a >> a[i].b;
	
	st = 1;		dr = 20000;
	while (st <= dr)
	{
		mid = st+(dr-st)/2;
		rz = timp(mid);
		if (rz == 1)		dr = mid-1;
		else st = mid+1;
	}
	if (timp(mid-1) == 1 && mid > 1)		mid--;
	if (timp(mid) == 0 && mid < 20000)	mid++;
	t = mid;
	
	for (j = 0; j <= l; j++)
	{
		v[1][j] = (t-j*a[1].a)/a[1].b;	
		if (v[1][j] < 0)	v[1][j] = 0;
		p[1][j] = j;
	}
	for (i = 2; i <= n; i++)
	{
		v[i][0] = v[i-1][0] + t/a[i].b;
		for (j = 1; j <= l; j++)
		{
			mx = -l;
			for (k = 0; k <= j; k++)
			{
				nr = (t-k*a[i].a)/a[i].b + v[i-1][j-k];
				if (nr > mx && t >= k*a[i].a)
				{
					mx = nr;	
					in = k;
				}
			}
			if (mx != -l)
			{
				v[i][j] = mx;
				p[i][j] = in;
			}
		}
	}
	
	st = 0;	rz = 0;
	x = n;	y = l;
	while (x > 1)
	{
		rz++;	r[rz] = p[x][y];
		st += p[x][y];
		y -= p[x][y];		x--;	
	}
	rz++;	r[rz] = l-st;

	fout << t << "\n";
	for (i = rz; i >= 1; i--)
	{
		x = r[i];
		fout << r[i] << " ";
		fout << (t-r[i]*a[n-i+1].a)/a[n-i+1].b << "\n";
	}
}