Cod sursa(job #2051620)

Utilizator shantih1Alex S Hill shantih1 Data 29 octombrie 2017 12:44:34
Problema Lapte Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 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 (j = 0; j <= l; j++)
	{
		v[1][j] = (t-j*a[1].a)/a[1].b;  
	}
	for (i = 2; i <= n; i++)
	{
		v[i][0] = v[i-1][0] + t/a[i].b;
		p[i][0] = 0;
		for (j = 1; j <= l; j++)
		{
			mx = -1;        in = -1;
			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 && v[i-1][j-k] >= 0)
				{
					mx = nr;    
					in = k;
				}
			}
			v[i][j] = mx;
			p[i][j] = in;
		}
	}
	
	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;
	rz = timp(t);
	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--)
	{
		fout << r[i] << " ";
		fout << (t-r[i]*a[n-i+1].a)/a[n-i+1].b << "\n";
	}
}