Pagini recente » Cod sursa (job #1138299) | Cod sursa (job #3144086) | Cod sursa (job #160678) | Cod sursa (job #1775958) | Cod sursa (job #810049)
Cod sursa(job #810049)
#include <fstream>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
using namespace std;
ifstream fi ("lapte.in");
ofstream fo ("lapte.out");
const int dim = 103;
int N, L;
int VA[dim], VB[dim];
int bestm, D[dim][dim], T[dim][dim];
void cit ()
{
fi >> N >> L;
for (int i = 1; i <= N; i++)
{
fi >> VA[i] >> VB[i];
}
}
int din (int t)
{
int n, a, a1, a2, d;
for (a = 0; a <= L; a++)
{
D[1][a] = (t - a * VA[1]) / VB[1];
}
for (n = 2; n <= N; n++)
{
for (a2 = 0; a2 <= L; a2++)
{
D[n][a2] = 0;
T[n][a2] = 0;
for (a1 = 0; a1 <= a2; a1++)
{
a = a2 - a1;
if (t > a * VA[n] && D[n-1][a1] > 0)
{
d = D[n-1][a1] + (t - a * VA[n]) / VB[n];
if (D[n][a2] < d)
{
D[n][a2] = d;
T[n][a2] = a1;
}
}
}
}
}
if (D[N][L] >= L)
return 1;
return 0;
}
void cauta ()
{
int p = 0, u = dim, t;
while (p <= u)
{
t = (p + u) >> 1;
if (din (t))
u = t - 1;
else
p = t + 1;
}
bestm = p;
din (bestm);
}
void afi (int n, int a)
{
if (n == 0)
{
fo << bestm << '\n';
return;
}
afi (n-1, T[n][a]);
fo << a - T[n][a] << ' ' << D[n][a] - D[n-1][T[n][a]] << '\n';
}
int main ()
{
cit ();
cauta ();
afi (N, L);
return 0;
}