Pagini recente » Cod sursa (job #1545193) | Cod sursa (job #1202099) | Cod sursa (job #1486899) | Cod sursa (job #1076042) | Cod sursa (job #2506632)
#include <cstdio>
using namespace std;
int n, m;
int a[105][105];
struct P{
int x, y;
}v[105], sl[105][105];
int verif(int med){
int i, j, k, d;
for(i = 0;i <= n;i++)
for(j = 0;j <= m;j++)
a[i][j]= -20000000;
a[0][0]=0;
for(i = 1;i <= n;i++){
for(j = 0;j <= m;j++){
for(k = j;k >= 0;k--){
d = (j - k) * v[i].y;
if(d > med)
k = -1;
else
if(a[i][j] < a[i-1][k] + (med - d) / v[i].x){
a[i][j] = a[i-1][k] + (med-d) / v[i].x;
sl[i][j].x = (med - d) / v[i].x;
sl[i][j].y = j - k;
}
}
}
}
if(a[n][m] >= m)
return 1;
return 0;
}
void afis(int n, int m){
if(n != 1)
afis(n - 1, m - sl[n][m].y);
printf("%d %d\n", sl[n][m].x, sl[n][m].y);
}
int main(){
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
int i, st, dr, med;
scanf("%d%d", &n, &m);
for(int i=1;i<=n;++i){
scanf("%d%d", &v[i].x, &v[i].y);
}
st = 1;
dr = 100 * 200;
while(st <= dr){
med = (st+dr)/2;
if(verif(med))
dr = med - 1;
else
st = med + 1;
}
verif(st);
printf("%d\n", st);
afis(n, m);
return 0;
}