Pagini recente » Cod sursa (job #738538) | Cod sursa (job #2643046) | Cod sursa (job #2904750) | Cod sursa (job #1508617) | Cod sursa (job #841185)
Cod sursa(job #841185)
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int n, cnt, i, rezultat;
struct ches{
int a, b, c, i;
};
ches v[105], sol[105], s1[105];
inline int cmp(ches a, ches b){
return a.c < b.c;
}
int check(int val){
int st[105] = {0}, i, rs = cnt, x;
for (i = 1; i <= n; i ++)
s1[i].a = 0, s1[i].b = 0;
for (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;
s1[v[i].i].a = x / v[i].a;
//printf("mai avem %d lapte, cu %d in momentul %d, x fiind %d\n", rs, st[i], i, x);
if (rs <= 0)
break;
}
if (rs > 0)
return 0;
rs = cnt;
for (i = n; i; i --){
x = min(val, rs*v[i].b);
rs -= x / v[i].b;
s1[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;
}
if (rs > 0)
return 0;
return 1;
}
int bs(){
int li = 1, ls = 100, x, gs = 0;
while (li <= ls){
x = (li+ls) / 2;
if (check(x)){
gs = x;
for (int i = 1; i <= n; i ++)
sol[i].a = s1[i].a, sol[i].b = s1[i].b;
ls = x-1;
}
else
li = x+1;
}
return gs;
}
int main()
{
freopen("lapte.in", "rt", stdin);
freopen("lapte.out", "wt", stdout);
scanf("%d%d", &n, &cnt);
for (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, cmp);
//rezultat = bs();
for (i = 1; i <= 100; i ++){
//printf("\nPENTRUL TIMPUL %d\n", i);
if (check(i)){
rezultat = i;
for (int j = 1; j <= n; j ++)
sol[j].a = s1[j].a, sol[j].b = s1[j].b;
break;
}
}
printf("%d\n", rezultat);
for (i = 1; i <= n; i ++)
printf("%d %d\n", sol[i].a, sol[i].b);
return 0;
}