Cod sursa(job #868296)

Utilizator ingridutz95Botescu Ingrid ingridutz95 Data 30 ianuarie 2013 21:36:54
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<fstream>
using namespace std;
#define dim 102
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 determinare(int x){
	//D[i][j] este nr maxim de litri din B daca primii i baieti beau j litri din A
	for(i=0;i<=n;i++)
		for(j=0;j<=L;j++)
			D[i][j]=-1;
	int i,j,k,XB,NRLB;
	D[0][0]=0;
	for(i=1;i<=n;i++)
		LAA[i]=x/LA[i]; //nr max de litri din A ce poate fi baut de baiatul i
	for(i=1;i<=n;i++)
		for(j=0;j<=L;j++){
			for(k=0;k<=j && k<=LAA[i];k++){ //baiatul i bea k litri din A
				if(D[i-1][j-k]!=1){
					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(determinare(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);
	determinare(TM);
	g<<TM<<'\n';
	for(i=n;i<=1;i--){
		CA[i]=AF[i][L];
		L-=CA[i];
		CB[i]=(TM-LA[i]*CA[i])/LB[i];
	}
	for(i=1;i<=n;i++)
		g<<CA[i]<<" "<<CB[i]<<'\n';
	return 0;
}