Pagini recente » Cod sursa (job #1820863) | Cod sursa (job #1443782) | Cod sursa (job #941195) | Cod sursa (job #2599710) | Cod sursa (job #810281)
Cod sursa(job #810281)
#include <fstream>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int MAX_N = 110;
int N, L;
int a[MAX_N], b[MAX_N];
int pd[MAX_N][MAX_N], order[MAX_N][MAX_N];
int result, rA[MAX_N], rB[MAX_N];
void read_input();
void binary_search();
bool testSolution(int val);
void rebuild();
void write_output();
int main() {
read_input();
binary_search();
rebuild();
write_output();
return 0;
}
void read_input() {
fin >> N >> L;
for (int i = 1; i <= N; ++i) {
fin >> a[i] >> b[i];
}
}
void binary_search() {
int lo = 1, hi = 101;
while (lo < hi) {
int mid = lo + (hi - lo) / 2;
if (testSolution(mid) == true) {
hi = mid;
} else {
lo = mid + 1;
}
}
result = lo;
}
bool testSolution(int val) {
for (int i = 0; i <= N; ++i) {
for (int j = 0; j <= L; ++j) {
pd[i][j] = -1;
}
}
pd[0][0] = 0;
for (int i = 1; i <= N; ++i) {
for (int j = 0; j <= L; ++j) {
for (int k = 0; k <= j; ++k) {
if (pd[i-1][k] != -1 && (j - k) * a[i] <= val
&& pd[i-1][k] + (val - a[i] * (j - k)) / b[i] > pd[i][j]) {
pd[i][j] = pd[i-1][k] + (val - a[i] * (j - k)) / b[i];
order[i][j] = k;
}
}
}
}
if (pd[N][L] >= L) {
return true;
}
return false;
}
void rebuild() {
int l = L;
testSolution(result);
for (int i = N ; i > 0; --i) {
rA[i] = l - order[i][l];
rB[i] = pd[i][l] - pd[i - 1][order[i][l]];
l = order[i][l];
}
}
void write_output() {
fout << result << '\n';
for (int i = 1; i <= N; ++i) {
fout << rA[i] << ' ' << rB[i] << '\n';
}
}