Pagini recente » Cod sursa (job #1591794) | Cod sursa (job #2455657) | Cod sursa (job #622703) | Cod sursa (job #284277) | Cod sursa (job #2065767)
#include <bits/stdc++.h>
#define nmax 123
using namespace std;
struct A{
int a, b, c, i;
};
A v[ nmax ], sol[ nmax ], s[ nmax ];
int n, vaL, R;
bool sorT(A a, A b){
return a.c < b.c;
}
int rezolvare(int val){
int st[ nmax ] = {0}, rs = vaL, x;
for (int i = 1; i <= n; i++)
s[ i ].a = s[ i ].b = 0;
for (int i = 1; i <= n; i++){
x = min(val, rs * v[ i ].a);
rs -= x / v[ i ].a;
st[ i ] = x / v[ i ].a * v[ i ].a;
s[ v[ i ].i ].a = x / v[ i ].a;
if (rs <= 0)
break;
}
if (rs > 0)
return 0;
rs = vaL;
for (int i = n; i >= 1; i--){
x = min(val, rs * v[ i ].b);
rs -= x / v[ i ].b;
s[v[ i ].i].b = x / v[ i ].b;
if (st[ i ] + x / v[ i ].b * v[ i ].b > val)
return 0;
if (rs <= 0)
break;
}
return !(rs > 0);
}
int binarY(){
int li = 1, ls = 100, gs = -1;
while (li <= ls){
int mid = (li + ls) / 2;
if (rezolvare( mid )){
gs = mid;
for (int i = 1; i <= n; i ++)
sol[ i ].a = s[ i ].a, sol[ i ].b = s[ i ].b;
ls = mid - 1;
}
else
li = mid + 1;
}
return gs;
}
int main()
{
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
scanf("%d %d", &n, &vaL);
for (int i = 1; i <= n; i++){
scanf("%d %d", &v[ i ].a, &v[ i ].b);
v[ i ].c = v[ i ].a - v[ i ].b;
v[ i ].i = i;
}
sort(v + 1, v + n + 1, sorT);
R = binarY();
printf("%d ", R);
printf("\n");
for (int i = 1; i <= n; i++){
printf("%d %d",sol[ i ].a, sol[ i ].b);
printf("\n");
}
}