Cod sursa(job #808348)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 6 noiembrie 2012 17:34:26
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
using namespace std;

ifstream fi ("lapte.in");
ofstream fo ("lapte.out");

const int dim = 101;
int N, L;
int VA[dim], VB[dim], CA[dim], CB[dim], M[dim];
int bestm, bestCA[dim], bestCB[dim];

void cit ()
{
	fi >> N >> L;
	for (int i = 1; i <= N; i++)
	{
		fi >> VA[i] >> VB[i];
	}
	bestm = dim;
}

void back (int a, int b, int m, int x)
// a, b lapte baut
// m minute scurse
// x individul curent
{
	if (x == N + 1)
	{
		x = 1;
		m++;
	}
	
	if (a >= L && b >= L)
	{
		for (int i = 1; i <= N; i++)
			m = max (m, M[i]);
		if (bestm > m)
		{
			bestm = m;
			for (int i = 1; i <= N; i++)
			{
				bestCA[i] = CA[i];
				bestCB[i] = CB[i];
			}			
		}		
		return;
	}
	
	if (M[x] == m)
	{
		if (m < bestm && a < L)
		{
			M[x] = m + VA[x];
			CA[x]++;
			
			back (a + 1, b, m, x + 1);
			
			CA[x]--;
			M[x] = m;
		}
		if (m < bestm && b < L)
		{
			M[x] = m + VB[x];
			CB[x]++;
			
			back (a, b + 1, m, x + 1);
			
			CB[x]--;
			M[x] = m;
		}
	}
	else
	{
		if (m < bestm)
		{
			back (a, b, m, x + 1);
		}
	}
}

void afi ()
{
	fo << bestm << '\n';
	for (int i = 1; i <= N; i++)
	{
		fo << bestCA[i] << ' ' << bestCB[i] << '\n';
	}
}

int main ()
{
	cit ();
	back (0, 0, 0, 1);
	afi ();
	
	return 0;
}