Pagini recente » Cod sursa (job #2622449) | Cod sursa (job #2128512) | Cod sursa (job #3305349) | Cod sursa (job #2830067) | Cod sursa (job #3305343)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n, need;
int prodA[110], prodB[110], ramas[110];
int solA[110], solB[110];
struct Iris {
int a, b;
int index;
}v[110];
inline int cmp(Iris a, Iris b) {
return a.a - a.b > b.a - b.b;
}
inline int check(int x) {
int cntA = 0, cntB = 0;
for(int i=1; i<=n; i++) {
prodA[i] = x / v[i].a;
cntA += prodA[i];
ramas[i] = x % v[i].a;
}
if(cntA < need) return 0;
for(int i=1; i<=n; i++) {
prodB[i] = ramas[i] / v[i].b;
cntB += prodB[i];
ramas[i] %= v[i].b;
}
if(cntB >= need) return 1;
for(int i=1; i<=n && cntB < need; i++) {
int schimbMax = (prodA[i] * v[i].a + ramas[i]) / v[i].b;
if(cntB + schimbMax < need) {
ramas[i] = (prodA[i] * v[i].a + ramas[i]) % v[i].a;
cntA -= prodA[i], prodA[i] = 0;
prodB[i] = schimbMax, cntB += prodB[i];
prodA[i] = ramas[i] / v[i].a, cntA += prodA[i];
ramas[i] %= v[i].a;
}
else {
int dif = need - cntB;
int take = (dif * v[i].b - ramas[i]) / v[i].a;
if((dif * v[i].b - ramas[i]) % v[i].a != 0) take++;
prodA[i] -= take, cntA -= take;
prodB[i] = dif, cntB = need;
ramas[i] = (dif * v[i].b - ramas[i]) % v[i].a;
prodA[i] += ramas[i] / v[i].a, cntA += ramas[i] / v[i].a;
ramas[i] %= v[i].a;
}
if(cntA < need) return 0;
}
if(cntA < need || cntB < need) return 0;
return 1;
}
int main()
{
fin >> n >> need;
for(int i=1; i<=n; i++) {
fin >> v[i].a >> v[i].b;
v[i].index = i;
}
sort(v+1, v+n+1, cmp);
int st = 1, dr = 2e9, sol = -1;
while(st <= dr) {
int mid = (st + dr) / 2;
if(check(mid)) sol = mid, dr = mid - 1;
else st = mid + 1;
}
fout << sol << '\n';
check(sol);
for(int i=1; i<=n; i++) {
solA[v[i].index] = prodA[i];
solB[v[i].index] = prodB[i];
}
for(int i=1; i<=n; i++) fout << solA[i] << " " << solB[i] << '\n';
return 0;
}