Pagini recente » Cod sursa (job #386364) | Istoria paginii runda/lalalala/clasament | Cod sursa (job #2246987) | Istoria paginii runda/winners23 | Cod sursa (job #1897746)
#include <fstream>
#include <iostream>
#include <cmath>
using namespace std;
const int nMax = 110;
int n, l;
struct litrii {
int a, b;
} v[nMax];
int a[nMax][nMax], abaut[nMax][nMax];
ifstream in("lapte.in");
ofstream out("lapte.out");
void citire() {
in >> n >> l;
for (int i = 1; i <= n; ++i) {
in >> v[i].a >> v[i].b;
}
}
bool ok(int t) {
// a[i][j] = nr maxim de litrii de b care pot fii bauti de primii i oameni
// stiind ca s-au baut j litrii de a
for (int lc = 1; lc <= l; ++lc) {
a[0][lc] = -2000000;
}
for (int i = 1; i <= n; ++i) {
for (int lc = 0; lc <= l; ++lc) {
// vreau sa calculez a[i][lc]
// iau pa rand cati litrii de a vreau sa bea i
a[i][lc] = -2000000;
for (int k = 0; k <= lc; ++k) {
// i bea k litrii de a
if (k * v[i].a > t) {
continue;
}
int lb = (t - k * v[i].a) / v[i].b + a[i-1][lc - k];
if (a[i][lc] < lb) {
a[i][lc] = lb;
abaut[i][lc] = k;
}
}
}
}
return a[n][l] >= l;
}
int bs() {
//cautam binar timpul maxim
int i, step = 1 << 7;
int st = 1, dr = 100, gasit = -1;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(ok(mij) == true)
{
gasit = mij;
dr = mij - 1;
}
else
{
st = mij + 1;
}
}
//out << gasit << "\n";
return gasit;
}
void reconstruieste(int t, int i, int lc) {
if (i != 1) {
reconstruieste(t, i - 1, lc - abaut[i][lc]);
}
out << abaut[i][lc] << ' ' << (t - abaut[i][lc] * v[i].a) / v[i].b << '\n';
}
int main() {
citire();
int timp = bs();
out << timp << '\n';
ok(timp);
reconstruieste(timp, n, l);
return 0;
}