Pagini recente » Cod sursa (job #1166646) | Cod sursa (job #3168084) | Cod sursa (job #26836) | Cod sursa (job #290992) | Cod sursa (job #1027423)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int NMAX = 102;
struct bautor{
int x,y,p;
}V[NMAX], Sol[NMAX];
int N, C;
inline bool cmp(const bautor&a, const bautor&b){
if(a.x*b.y != b.x*a.y)
return a.x*b.y < b.x*a.y;
else
return a.x < b.x;
}
bool tryToDrink(int time){
int C1 = C, C2 = C, dif, val1, val2;
for(int i = 0; i < N; i++){
if(C1 > 0) {
val1 = time/V[i].x;
C1 -= val1;
dif = time%V[i].x;
if(C1 < 0){
dif += (-C1)*V[i].x;
C1 = 0;
}
val2 = dif/V[i].y;
C2 -= val2;
Sol[V[i].p].x = val1;
Sol[V[i].p].y = val2;
}
else {
val2 = time/V[i].y;
C2 -= val2;
Sol[V[i].p].x = 0;
Sol[V[i].p].y = val2;
}
}
if(C1 <= 0 && C2 <= 0){
return true;
}
else {
return false;
}
}
int searchMinValue()
{
int i, step;
for (step = 1; step < 10000; step <<= 1);
for (i = 0; step; step >>= 1)
if (i + step < 10000 && tryToDrink(i+step) == false)
i += step;
while(!tryToDrink(i))
i++;
while(tryToDrink(i))
i--;
return i+1;
}
int main()
{
int i;
in >> N >> C;
for(i = 0; i < N; i++){
in >> V[i].x >> V[i].y;
V[i].p = i;
}
sort(V,V+N,cmp);
out << searchMinValue() << '\n';
for(i = 0; i < N; i++){
out << Sol[i].x << ' ' << Sol[i].y << '\n';
}
return 0;
}