Cod sursa(job #1264309)

Utilizator nimicLeoveanu Mihaita Alexandru nimic Data 15 noiembrie 2014 18:14:20
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<fstream>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");

struct lapte{
	int a, b;
};

const int nmax = 106;
lapte v[nmax];
int n, d[nmax][nmax], mrasp[nmax][nmax], l, rasp, vrasp[nmax];

bool verificare(int x)
{
    for(int i = 0; i<=n; i++)
		for(int j = 0; j<=l; j++)
			d[i][j] = -100000000;
    d[0][0] = 0;
    for(int i = 1; i<=n; i++)
	{
        for(int j = 0; j<=l; j++)
		{
			for( int k = 0; k<=j && k * v[i].a<=x; k++)
			{
				int aux = (x - k * v[i].a) / v[i].b;
                if(d[i][j]<d[i - 1][j - k] + aux)
				{
                    d[i][j] = d[i - 1][j - k] + aux;
                    mrasp[i][j] = k;
                }
            }
        }
    }

	if(d[n][l]>=l)
		return 1;
	else
		return 0;
}

int bs()
{
	int hi = 106, lo = -1, mid;
	while(hi - lo>1)
	{
		mid = (hi + lo) / 2;

		if(verificare(mid)==1 && verificare(mid - 1)==0)
			return mid;

		if(verificare(mid)==1)
			hi = mid;
		else
			lo = mid;
	}

	if(verificare(mid)==1 && verificare(mid - 1)==0)
			return mid;
	if(verificare(hi)==1 && verificare(hi - 1)==0)
			return hi;
	if(verificare(lo)==1 && verificare(lo - 1)==0)
			return lo;
}

int main(){
	int player_unu=0;

	in>>n>>l;
	for(int i = 1; i<=n; i++)
	{
		in>>v[i].a>>v[i].b;
	}

	rasp = bs();
	verificare(rasp);
	out<<rasp<<'\n';

	int aux = n;
	while(aux!=0)
	{
		vrasp[aux] = mrasp[aux][l];
		l -= mrasp[aux][l];
		aux--;
	}

	for(int i = 1; i<=n; i++)
	{
		out<<vrasp[i]<<' '<<(rasp - vrasp[i] * v[i].a) / v[i].b<<'\n';
	}

	return player_unu;
}