Pagini recente » Cod sursa (job #1186619) | Cod sursa (job #1139882) | Cod sursa (job #2749419) | Cod sursa (job #336552) | Cod sursa (job #1027353)
#include <cstdio>
#include <algorithm>
using namespace std;
struct betiv
{
int C1, C2, poz;
}
v[109];
int cmp(const betiv &A, const betiv &B)
{
return A.C1 * B.C2 < A.C2 * B.C1;
}
int cmp_pt_afisare(const betiv &A, const betiv &B)
{
return A.poz < B.poz;
}
int main()
{
int n, lLapte, sol = -1;
freopen("lapte.in","r", stdin);
freopen("lapte.out", "w", stdout);
scanf("%d %d", &n, &lLapte);
for (int i=1; i<=n; ++i)
{
scanf("%d %d", &v[i].C1, &v[i].C2);
v[i].poz = i;
}
sort(v+1, v+n+1, cmp);
int x=1, y = 100 * lLapte * 100;
while (x <= y)
{
int z = (x+y) / 2, time_used[109], LapteA = lLapte, LapteB = lLapte;
for (int i = 1; i <= n; ++i)
{
int fol = min(LapteA, z/v[i].C1);
LapteA -= fol;
time_used[i] = fol * v[i].C1;
}
for (int i = n; i > 0 && LapteB > 0; --i)
LapteB -= (z - time_used[i]) / v[i].C2;
if (LapteA < 1 && LapteB < 1)
sol = z, y = z-1;
else
x = z + 1;
}
printf("%d\n", sol);
{
int time_used[109], LapteA = lLapte, LapteB = lLapte;
for (int i = 1; i <= n; ++i)
{
int fol = min(LapteA, sol / v[i].C1);
LapteA -= fol;
time_used[i] = fol * v[i].C1;
v[i].C1 = fol;
}
for (int i = n; i > 0; --i)
{
int fol = min(LapteB, (sol - time_used[i]) / v[i].C2);
LapteB -= fol;
v[i].C2 = fol;
}
}
sort(v+1, v+n+1, cmp_pt_afisare);
for (int i = 1; i <= n; ++i)
printf("%d %d\n", v[i].C1, v[i].C2);
return 0;
}