Pagini recente » Cod sursa (job #2906972) | Cod sursa (job #692505) | Cod sursa (job #191480) | Cod sursa (job #592168) | Cod sursa (job #1800375)
#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;
}