Cod sursa(job #611315)

Utilizator popoiu.georgeGeorge Popoiu popoiu.george Data 31 august 2011 20:16:27
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include<stdio.h>
#define inf "lapte.in"
#define outf "lapte.out"
#define NMax 101
#define INF 0x3f3f3f3f
using namespace std;

int N, L, T;
int A[NMax], B[NMax];
int C[NMax][NMax], back[NMax][NMax], rez = INF;
//C[i][l] = nr maxim de litri de lapte B care se poate bea de primii i prieteni daca acestia beau l litri de lapte A

void read()
{
	scanf("%d%d", &N, &L);
	for(int i=1; i<=N; i++) scanf("%d%d", &A[i], &B[i]);
}

void print(int i, int l)
{
	if( !i ) return;
	print(i-1, l-back[i][l]);
	printf("%d %d\n", back[i][l], (T - back[i][l]*A[i])/B[i]);
}

bool PD(int flag) //flag = 0 <-> in binary search; flag = 1 <-> outside binary search
{
	for(int i=0; i<=N; i++)
		for(int j=0; j<=L; j++) C[i][j] = -INF;
	C[0][0] = 0;

	for(int i = 1; i<=N; i++)
		for(int l=0; l<=L; l++)
		{
			for(int j=0; ( (j<=l) && (j*A[i]<=T) ) ; j++)
				if( C[i][l] < C[i-1][l-j] + (T-j*A[i])/B[i] ) 
				{
					C[i][l] = C[i-1][l-j] + (T-j*A[i])/B[i] ;
					back[i][l] = j;
				}
		}
	if( C[N][L]>=L )
	{
		if( flag ) print(N,L);
		return true;
	}
	return false;
}

void solve()
{
	int li = 1, ls = NMax-1;
	while( li<=ls )
	{
		T = (li+ls)/2;
		if( PD(0) )
		{
			if( T < rez ) rez = T;
			ls = T-1;
		}
		else li = T+1;
	}	
	T = rez;
	printf("%d\n", T);
	PD(1);
}

int main()
{
	freopen(inf,"r",stdin); freopen(outf,"w",stdout);
	read(); solve();
	return 0;
}