Pagini recente » Cod sursa (job #1239400) | Istoria paginii runda/sad/clasament | Cod sursa (job #2177353) | Monitorul de evaluare | Cod sursa (job #792281)
Cod sursa(job #792281)
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
struct data
{
int a, b, ind, ca, cb;
}V[110];
int l, N;
bool cmp1(data one, data two)
{
return (one.a - one.b) < (two.a - two.b);
}
bool cmp2(data one, data two)
{
return one.ind < two.ind;
}
bool Verify(int val)
{
int a = l, b = l, i = 1, now, tp;
while(a && i <= N)
{
V[i].ca = V[i].cb = 0;
now = val / V[i].a;
tp = val;
tp -= min(a, now) * V[i].a;
V[i].ca = min(a, now);
a = (now >= a ? 0 : a - V[i].ca);
V[i].cb = tp / V[i].b;
b -= V[i].cb;
i ++;
}
for(; i <= N; i++)
{
V[i].ca = V[i].cb = 0;
V[i].cb = val / V[i].b;
b -= V[i].cb;
}
if(a <= 0 && b <= 0)
return 1;
return 0;
}
int BS()
{
int left = 1, right = 256, mid, ans;
while(left <= right)
{
int mid = (left + right) / 2;
if(Verify(mid))
{
ans = mid;
right = mid - 1;
}else
{
left = mid + 1;
}
}
if(Verify(ans)) return ans;
}
int main()
{
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
int i;
scanf("%i %i", &N, &l);
for(i = 1; i <= N; i++)
{
scanf("%i %i", &V[i].a, &V[i].b);
V[i].ind = i;
}
sort(V + 1, V + N + 1, cmp1);
printf("%i\n", BS());
sort(V + 1, V + N + 1, cmp2);
for(i = 1; i <= N; i++)
printf("%i %i\n", V[i].ca, V[i].cb);
return 0;
}