Cod sursa(job #478484)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 18 august 2010 21:15:05
Problema Lapte Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<iostream>
#include<cstring>
#include<fstream>

using namespace std;

int beau[101][101],n,l;
int a[100],b[100];

int is_ok(int T)
{
	int best1[101],best2[101];

	for(int i=0;i<=l;i++)
	{
		best1[i]=-1;
		best2[i]=-1;
	}
	for(int i=0;i<=T/a[0];i++)
		best1[i]=(T-i*a[0])/b[0];	

	for(int i=1;i<n;i++)
	{
		for(int j=0;j<=l;j++)
		{
			for(int k=0;k<=T/a[i];k++)
			{
				if(j-k>=0 && best1[j-k]>=0)
				{
					int nr=best1[j-k]+((T-k*a[i])/b[i]);
					if(nr>best2[j])
					{
						best2[j]=nr;
						beau[i][j]=k;
					}
				}
			}
		}
		for(int i=0;i<=l;i++)
			best1[i]=best2[i];
	}
	if(best1[l]>=l)
		return 1;
	return 0;
}

int search()
{
	int left=0,right=100,rez;

	while(left<=right)
	{
		int mij=(left+right)/2;
		if(is_ok(mij))
		{
			right=mij-1;
			rez=mij;
		}
		else
			left=mij+1;
	}
	return rez;
}

void write_sol(int tmin)
{
	ofstream out("lapte.out");
	int lapteA[100],lapteB[100];

	is_ok(tmin);
	int cant=l;
	for(int i=n-1;i>=0;i--)
	{
		lapteA[i]=beau[i][cant];
		lapteB[i]=(tmin-beau[i][cant]*a[i])/b[i];
		cant-=beau[i][cant];
	}

	out<<tmin<<"\n";
	for(int i=0;i<n;i++)
		out<<lapteA[i]<<" "<<lapteB[i]<<"\n";
	out.close();
}

int main()
{
	ifstream in("lapte.in");
	
	in>>n>>l;
	for(int i=0;i<n;i++)
		in>>a[i]>>b[i];
	in.close();
	
	int tmin=search();
	write_sol(tmin);
}