Cod sursa(job #472628)

Utilizator ooctavTuchila Octavian ooctav Data 25 iulie 2010 21:24:44
Problema Lapte Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <cstdio>
#include <algorithm>
using namespace std;

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

void write()
{
	for(int i = 1 ; i <= N ; i++)
	{
		for(int j = 1 ; j <= L ; j++)
			printf("%d(%d) ", lapte[i][j].first, lapte[i][j].second);
		printf("\n");
	}
	printf("\n\n\n");
}

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)
{
	int lim[NMAX];
	for(int i = 0 ; i <= N ; i++)
		for(int j = 0 ; j <= L ; j++)
		{
			lapte[i][j].first = 0;
			lapte[i][j].second = 0;
		}
	
	lim[0] = 0;
	for(int i = 1 ; i <= N ; i++)
		lim[i] = lim[i - 1] + timp / e[i].a;
	
	for(int j = 0 ; j <= lim[1] ; j++)
		lapte[1][j].first = (timp - (j * e[1].a)) / e[1].b;
	
	for(int i = 2 ; i <= N ; i++)
		for(int j = 0 ; j <= lim[i] ; j++)
			for(int k = 0 ; k <= min(j, timp / e[i].a) ; k++)
				if(j - k <= lim[i - 1])
					if(lapte[i - 1][j - k].first + (timp - (k * e[i].a)) / e[i].b > lapte[i][j].first)
					{
						lapte[i][j].first = lapte[i - 1][j - k].first + (timp - (k * e[i].a)) / e[i].b;
						lapte[i][j].second = j - k;
					}
	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);
	//write();
}

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;
}