Cod sursa(job #472592)

Utilizator ooctavTuchila Octavian ooctav Data 25 iulie 2010 20:04:36
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define NMAX 105
const int LMAX = 105;
#define TMAX 101
int N, L, T;
struct timpi
{
	int a,b;
}e[NMAX];
pair<int, int> lapte[NMAX][LMAX];

void citire()
{
	scanf("%d %d",&N,&L);
	for(int i = 1 ; i <= N ; i++)
		scanf("%d %d", &e[i].a, &e[i].b);
}

int ok(int timp)
{
	for(int i = 0 ; i <= N ; i++)
		for(int j = 0 ; j <= L ; j++)
		{
			lapte[i][j].first = 0;
			lapte[i][j].second = 0;
		}
		
	for(int j = 0 ; j <= L ; j++)
	{
		if(j * e[1].a > timp)
			break;
		lapte[1][j].first = (timp - (j * e[1].a)) / e[1].b;	
	}
	
	for(int i = 1 ; i < N ; i++)
		for(int j = 0 ; j <= L ; j++)
			for(int k = 0 ; j + k <= L && k * e[i + 1].a <= timp ; k++)
				if(lapte[i][j].first + (timp - (k * e[i + 1].a)) / e[i + 1].b > lapte[i + 1][j + k].first)
				{
					lapte[i + 1][j + k].first = lapte[i][j].first + (timp - (k * e[i + 1].a)) / e[i + 1].b;
					lapte[i + 1][j + k].second = j;
				}
	if(lapte[N][L].first >= L)
		return 1;
	return 0;
}

void cautare_bin()
{
	int p=1;
	while((p<<1)<TMAX)
		p<<=1;
	while(p)
	{
		if(!ok(T+p))
			T+=p;
		p>>=1;
	}
	ok(++T);
}

void scrie()
{
	pair<int, int> rez[NMAX];
	int j = L;
	for(int i = N ; i ; i--)
	{
		rez[i].first = j - lapte[i][j].second;
		rez[i].second = lapte[i][j].first - lapte[i - 1][lapte[i][j].second].first;
		j = lapte[i][j].second;
	}
	
	printf("%d\n", T);
	for(int i = 1 ; i <= N; i++)
		printf("%d %d\n", rez[i].first, rez[i].second);
}

int main()
{
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	
	citire();
	cautare_bin();
	scrie();
	
	return 0;
}