Pagini recente » Cod sursa (job #2934694) | Cod sursa (job #1460639) | Cod sursa (job #340329) | Cod sursa (job #1440666) | Cod sursa (job #29995)
Cod sursa(job #29995)
// c[i][j] - cantitatea maxima de lapte b bauta astfel incat primii i
// bautori sa bea cantitatea j de lapte A
//
#include <stdio.h>
#include <algorithm>
#define nmax 105
#define lmax 105
using namespace std;
int deunde[nmax][lmax];
int cA[nmax],cB[nmax];
int lA[nmax],lB[nmax];
int n,l,i;
int c[nmax][lmax];
void delay() {
for(int i = 1; i <= 30000; i++)
for(int j = 1; j <= 10000; j++) ;
}
int bun(int x) {
int i,j,k;
for(i = 0; i <= n; i++)
for(j = 0; j <= l; j++)
c[i][j] = -1;
c[0][0] = 0;
for(i = 1; i <= n; i++)
for(j = 0; j <= l; j++) {
c[i][j] = -1;
for(k = 0; k <= j; k++)
if(c[i - 1][k] != -1) {
int tlA = (j - k) * lA[i];
if(tlA <= x)
if(c[i][j] < c[i - 1][k] + (x - tlA) / lB[i]) {
c[i][j] = c[i - 1][k] + (x - tlA) / lB[i];
deunde[i][j] = k;
}
}
}
if(c[n][l] >= l) return 1;
else return 0;
}
int cauta(int f,int l) {
int r = l + 1;
while(f <= l) {
int m = (f + l) / 2;
if(bun(m)) {
r = m;
l = m - 1;
}
else f = m + 1;
}
return r;
}
int main() {
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d%d",&n,&l);
for(i = 1; i <= n; i++) scanf("%d%d",&lA[i],&lB[i]);
int t = cauta(1,100);
printf("%d\n",t);
bun(t);
int A = l;
for(i = n; i >= 1; i--) {
cB[i] = c[i][A] - c[i - 1][deunde[i][A]];
cA[i] = A - deunde[i][A];
A = deunde[i][A];
}
for(i = 1; i <= n; i++) printf("%d %d\n",cA[i],cB[i]);
return 0;
}