Cod sursa(job #800552)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 21 octombrie 2012 22:52:48
Problema Lapte Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<fstream>

#define dim 102
using namespace std;



ifstream f("lapte.in");
ofstream g("lapte.out");

int D[dim][dim],TM,i,j,LA[dim],LB[dim],CA[dim],CB[dim],AF[dim][dim],n,L,LAA[dim];
int det(	int X 	){
	
	//D[i][j] numarul maxim  de litri din B daca primii i betivani beau j litri din A
	
	int i,j,k,XB,NRLB; 
	for(j=0;j<=dim;++j)
			D[0][j]=-1;
			AF[0][j]=0;
	D[0][0]=0;
	for(i=1;i<=n;++i)
		LAA[i]=X/LA[i];//nr maxim de litri din Ace poate fii baut de betivanu cu nr i
	
	for(i=1;i<=n;++i) 
		for(j=0;j<=L;++j){
			D[i][j]=-1;
			for(k=0;k<=j && k<=LAA[i];++k){// betivanu i bea k litri din A
				
				if(D[i-1][j-k]>=0){
					
					XB=X-k*LA[i];// timp ramas  pt B
					NRLB=XB/LB[i];//nr litri B;
					
					if(D[i][j]<D[i-1][j-k]+NRLB && XB>=0){
						D[i][j]=D[i-1][j-k]+NRLB;
						AF[i][j]=k;
					}
				}
			}
			
		}
	
	if(D[n][L]>=L)
		return 1;
	
	return 0;
}
int bs(int st,int dr){
	
	int poz=st;
	int m;
	while(st<=dr){
		
		m=(st+dr)/2;
		if(det(m)){
			poz=m;
			dr=m-1;
		}
		else
			st=m+1;
		
	}
	return poz;
}
int main () {
	
	f>>n>>L;
	
	
	for(i=1;i<=n;++i)
		f>>LA[i]>>LB[i];

	TM=bs(1,110);
	
	det(TM);
	
	g<<TM<<"\n";
	for(i=n;i>=1;i--){
		CB[i]=D[i][L]-D[i-1][AF[i][L]];
		CA[i]=L-AF[i][L];
		L=AF[i][L];
	}
	
	for(i=1;i<=n;++i)
		g<<CA[i]<<" "<<CB[i]<<"\n";

	return 0;
}