Cod sursa(job #448057)

Utilizator RazvanSSavu Razvan RazvanS Data 2 mai 2010 16:04:33
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <iostream>
#include <fstream>

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

#define NMAX 101
#define CMAX 101
#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=0;n<=N;++n)
		for(lA=0;lA<=CMAX;++lA)
				lB[n][lA]=0, la[n][lA]=0;
	
	int l, lb, ta, val;
	for(n=1;n<=N;++n)
		for(lA=0;lA<=L;++lA) {
			int start = (n==1)?lA:0;
			for(l=start;l<=lA;++l) {
				if ( n== 1 ) la[n][lA] = l;
				if ( (ta=l*T[n][A]) > t ) break;
				lb = (t-ta) / T[n][B];
				if ( 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*L*L);	
	
	/* 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;; 
	}
	*/
	
	/*
	t = 3;
	reach_quantity ();
	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;
}