Pagini recente » Cod sursa (job #2773844) | Cod sursa (job #1693049) | Cod sursa (job #754530) | Cod sursa (job #448147) | Cod sursa (job #2427853)
#include <fstream>
#include <algorithm>
#define MAX 100
using namespace std;
struct lapte
{
int a;
int b;
int poz;
}v[MAX], cant[MAX], cantMin[MAX];
bool cmp(lapte a, lapte b)
{
if(a.a + b.b < b.a + a.b)return true;
return false;
}
bool cmpPoz(lapte a, lapte b)
{
if(a.poz < b.poz)return true;
return false;
}
bool solve(int N, int L, int T)
{
int cantA, cantB, i;
cantA = cantB = 0;
for(i = 0; i < N; i++)
{
cant[i].poz = v[i].poz;
if(cantA + T / v[i].a < L)
{
cantA += T / v[i].a;
cant[i].a = T / v[i].a;
cant[i].b = 0;
}
else{
int dif = L - cantA;
int rest = T - dif * v[i].a;
cantA = L;
cantB += rest / v[i].b;
cant[i].a = dif;
cant[i].b = rest / v[i].b;
}
}
if(cantA == L && cantB >= L)return true;
return false;
}
int main()
{
int n, l, i, st, dr, mij, gasit;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
fin >> n >> l;
for(i = 0; i < n; i++)
{
fin >> v[i].a >> v[i].b;
v[i].poz = i;
}
sort(v, v + n, cmp);
st = 1;
dr = MAX;
while(st <= dr)
{
mij = (st + dr) / 2;
if(solve(n, l, mij))
{
sort(cant, cant + n, cmpPoz);
for(i = 0; i < n; i++)
{
cantMin[i].a = cant[i].a;
cantMin[i].b = cant[i].b;
}
gasit = mij;
dr = mij - 1;
}
else st = mij + 1;
}
fout << gasit << '\n';
for(i = 0; i < n; i++)fout << cantMin[i].a << " " << cantMin[i].b << '\n';
fin.close();
fout.close();
return 0;
}