Cod sursa(job #448109)

Utilizator RazvanSSavu Razvan RazvanS Data 2 mai 2010 18:47:29
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <iostream>
#include <fstream>

#define file_in "lapte.in"
#define file_out "lapte.out"

#define NMAX 101
#define CMAX 101
#define UNRCH (-CMAX-1)
#define NAT_ISSUE 2

#define A 0
#define B 1

#define MAX(a,b) ( (a)>(b)?(a):(b) )

int N, L;
int T[NMAX][2];
int t;
int lB[NMAX][CMAX];
int la[NMAX][CMAX];

using namespace std;

int reach_quantity ( void ) {
	
	
	int n, lA;

	for(n=1;n<=N;++n)
		for(lA=0;lA<=CMAX;++lA)
				lB[n][lA]=UNRCH;
	
	int l, lb, ta, val;
	
	for(lA=0;lA<=L;++lA) {
		if ( (ta=lA*T[1][A]) > t ) break;
	
		la[1][lA] = lA;
		lB[1][lA] = (t-ta) / T[1][B];
		
	}
	
	for(n=2;n<=N;++n)
		for(lA=0;lA<=L;++lA) 
			for(l=0;l<=lA;++l) {
				if ( (ta=l*T[n][A]) > t ) break;
				lb = (t-ta) / T[n][B];

				if ( lB[n-1][lA-l] != UNRCH && (lB[n][lA] < (val = lB[n-1][lA-l] + lb)) )
					 lB[n][lA] = val, la[n][lA] = l;
			}

	
	if ( lB[N][L] >= L ) return 1;
	
	return 0;
}
				
void binary_search ( int start , int end ) {
	
	if ( start == end ) {
		t = end;
		reach_quantity ();	
		return;
	}
	t = (start+end)/2;
	
	if ( reach_quantity () ) binary_search (start, t);
	else binary_search (t+1,end);
	
}

int main ( void ) {
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	/* READ */
	cin >> N >> L;
	for(int n=1;n<=N;++n)
		cin>> T[n][A] >> T[n][B];
	/* END READ */
	
	binary_search(1,2*CMAX*CMAX);	
	
	/* WRITE */

	
	cout << t << endl;
	int V[NMAX];
	for (int n=N, l=L; n>=1 ; --n ) {
		V[n] = la[n][l];
		l-=la[n][l];
	}
		
	for (int n=1; n<=N; ++n) 
		cout << V[n] << " " << ( t - V[n] * T[n][A] ) / T[n][B] << endl;
	//cout << "V[N]=" << la[N][L] << endl;
	
	/* END WRITE */
	/*
	for (int i = 1; i<=2*L*L ; ++i ) {
		t = i;
		cout << i << " " << reach_quantity () << endl;; 
	}
	*/
	
	/*
	
	cout << endl;
	for(int n=1;n<=N;++n, cout << endl)
		for(int lA=0;lA<=L;++lA, cout << " ")
			cout<<lB[n][lA];
			
	cout << endl;
	for(int n=1;n<=N;++n, cout << endl)
		for(int lA=0;lA<=L;++lA, cout << " ")
		cout<<la[n][lA];
	
	*/
	
	return 0;
}