Cod sursa(job #1800375)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 7 noiembrie 2016 18:45:02
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

#define NM 105

int N, L, L1, L2, A[NM], B[NM];
int CD[NM][NM], CA[NM][NM];

// Trebuie sa mai bagi reconstituirea solutiei ca sa testezi solutia pe IA

vector< pair<int, int> > canDrink(int T)
{
	//cout << "canDrink " << T << endl;
	vector < pair <int, int> > answers;
	memset(CD, 0, sizeof(CD));
	CD[0][0] = 1;

	for (int i = 1; i <= N; ++i)
	{
		for (int a = 0; a <= L1; ++a)
			for (int b = 0; b <= L2; ++b)
				if (CD[a][b] == 0)
				{
					for (int c = 0; c <= T/A[i]; ++c)
					{
						int d = (T - A[i]*c)/B[i];
						int pa = max(a - c, 0);
						int pb = max(b - d, 0);
						if (CD[pa][pb] != i+1 && CD[pa][pb] != 0)
						{
							CD[a][b] = i+1;
							CA[a][b] = c;
							break;
						}
					}
				}
	}

	if (CD[L1][L2] == 0) return answers;

	int a = L1;
	int b = L2;
	int i = N;

	while (a > 0 || b > 0)
	{
		int cons_a = CA[a][b];
		int cons_b = (T - A[i]*CA[a][b])/B[i];
		int prev_a = a - cons_a;
		int prev_b = b - cons_b;
		answers.push_back(make_pair(cons_a, cons_b));
		i--;
		a = prev_a;
		b = prev_b;
	}
	reverse(answers.begin(), answers.end());
	return answers;
}

int beerAndWineBS(int left, int right)
{
	//cout << "Beer & Wine BS " << left << " " << right << "\n";
	vector <pair<int, int> > ans;
	if (left == right)
	{
		ans = canDrink(left);
		if (ans.size() != 0) return left;
		else return -1;
	}

	int mid = (left + right)/2;
	ans = canDrink(mid);
	if (ans.size() != 0) right = mid;
	else left = mid + 1;
	return beerAndWineBS(left, right);
}

int main()
{
	freopen ("lapte.in", "r", stdin);
    freopen ("lapte.out", "w", stdout);

    scanf ("%d %d", &N, &L);
    for (int i = 1; i <= N; ++i) scanf ("%d %d", &A[i], &B[i]);

    L1 = L2 = L;
    int left = 0;
	int right = 1000000;

	int Tmin = beerAndWineBS(left, right);
	printf("%d\n", Tmin);
	vector <pair<int, int> > answers = canDrink(Tmin);
	for (int i = 0; i < answers.size(); ++i)
	{
		printf ("%d %d\n", answers[i].first, answers[i].second);
	}

	return 0;
}