Pagini recente » Cod sursa (job #1716170) | Cod sursa (job #2031298) | Cod sursa (job #1460114) | Cod sursa (job #2793945) | Cod sursa (job #176860)
Cod sursa(job #176860)
#include <stdio.h>
#include <algorithm>
using namespace std;
const int N_MAX = 110;
int N, L;
struct bla {
int A, B;
} v[N_MAX], sol[N_MAX];
struct rap {
double r;
int ind;
} sor[N_MAX];
int cmp(rap a, rap b)
{
return (a.r < b.r);
}
int merge(int timp)
{
memset(sol, 0, sizeof(sol));
int canta = 0, cantb = 0, rama, ramb, poz;
for (int i = 1; i <= N; i ++) {
poz = sor[i].ind;
rama = L - canta;
ramb = L - cantb;
if (rama > 0) {
sol[poz].A = timp / v[poz].A;
if (sol[poz].A > rama) sol[poz].A = rama;
else rama -= sol[poz].A;
canta += sol[poz].A;
}
if (ramb > 0) {
sol[poz].B = (timp - (sol[poz].A * v[poz].A)) / v[poz].B;
if (sol[poz].B > ramb) sol[poz].B = ramb;
else ramb -= sol[poz].B;
cantb += sol[poz].B;
}
}
if (canta >= L && cantb >= L) return 1;
return 0;
}
int bs()
{
int i, step;
for (step = 1; step < 100; step <<= 1);
for (i = 0; step; step >>= 1) {
if (i + step <= 100 && !merge(i + step)) i += step;
}
return i;
}
int main()
{
freopen("lapte.in", "r", stdin);
#ifndef _SCREEN_
freopen("lapte.out", "w", stdout);
#endif
scanf("%d %d\n", &N, &L);
for (int i = 1; i <= N; i ++) {
scanf("%d %d\n", &v[i].A, &v[i].B);
sor[i].r = (double) v[i].A / (double) v[i].B;
sor[i].ind = i;
}
sort(sor + 1, sor + N + 1, cmp);
int T = bs() + 1;
printf("%d\n", T);
merge(T);
for (int i = 1; i <= N; i ++) {
printf("%d %d\n", sol[i].A, sol[i].B);
}
return 0;
}