Pagini recente » Cod sursa (job #672608) | Cod sursa (job #2793600) | Cod sursa (job #1174263) | Cod sursa (job #2435087) | Cod sursa (job #2505040)
#include <iostream>
#include <cstdio>
using namespace std;
int n, l;
int la[105], lb[105], a[105], b[105];
int d[105][105][105]; /// d[k][i][j] = timpul minim pt a consuma i litri de tip a si j litri de tip b folosind primele k persoane
int bs(int k, int lin, int col, int coef, int add) {
int st = 0, dr = col, last = max(d[k][lin][col], add), mij, val;
while(st <= dr) {
mij = (st + dr) / 2;
val = add + (col - mij) * coef;
last = min(last, max(d[k][lin][mij], val));
if(d[k][lin][mij] < val)
st = mij + 1;
else
dr = mij - 1;
}
return last;
}
int main() {
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
scanf("%d %d", &n, &l);
for(int k = 1; k <= n; k++) {
scanf("%d %d", &a[k], &b[k]);
if(k == 1) {
for(int i = 0; i <= l; i++)
for(int j = 0; j <= l; j++)
d[k][i][j] = i * a[k] + j * b[k];
}
else {
for(int i = l; i >= 0; i--)
for(int j = l; j >= 0; j--) {/// calculam d[k][i][j]
d[k][i][j] = d[k - 1][i][j];
for(int lin = i; lin >= 0 && (i - lin) * a[k] <= d[k - 1][lin][j]; lin--)
d[k][i][j] = min(d[k][i][j], bs(k - 1, lin, j, b[k], (i - lin) * a[k]));
}
}
}
printf("%d\n", d[n][l][l]);
// for(int i = 1; i <= n; i++) {
// printf("pers %d:\n", i);
// for(int j = 0; j <= l; j++) {
// for(int k = 0; k <= l; k++)
// printf("%d ", d[i][j][k]);
// printf("\n");
// }
// }
int lin = l, col = l, val = 0;
for(int k = n; k >= 2; k--)
for(int i = lin; i >= 0; i--)
for(int j = col; j >= 0; j--) {
val = (lin - i) * a[k] + (col - j) * b[k];
if(max(d[k - 1][i][j], val) == d[k][lin][col]) {
la[k] = lin - i;
lb[k] = col - j;
lin = i;
col = j;
i = -1;
j = -1;
}
}
la[1] = lin;
lb[1] = col;
for(int i = 1; i <= n; i++)
printf("%d %d\n", la[i], lb[i]);
return 0;
}