Pagini recente » Cod sursa (job #2003591) | Monitorul de evaluare | Diferente pentru planificare/sponsori intre reviziile 17 si 16 | Cod sursa (job #1598543) | Cod sursa (job #1794949)
#include <cstdio>
#define INF 10000000
using namespace std;
int n, l, a[130], b[130], d[130][130], t[130][130];
inline bool PD(int T){
for(int i = 1; i <= n ; ++i){
for(int j = 0; j <= l ; ++j){
d[i][j] = -INF;
t[i][j] = 0;
for(int k = 0; k <= j ; ++k)
if(a[i] * (j - k) <= T)
if(d[i][j] < d[i - 1][k] + (T - a[i] * (j - k)) / b[i]){
d[i][j] =d[i - 1][k] + (T - a[i] * (j - k)) / b[i];
t[i][j] = k;
}
}
}
if(d[n][l] < l)
return 0;
return 1;
}
inline void DFS(int l, int c){
if(l != 1)
DFS(l - 1, t[l][c]);
printf("%d %d\n", c - t[l][c], d[l][c] - d[l - 1][t[l][c]]);
}
int main()
{
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
scanf("%d%d", &n, &l);
for(int i = 1; i <= n ; ++i)
scanf("%d%d", &a[i], &b[i]);
for(int i = 1; i <= l ; ++i)
d[0][i] = -INF;
int st = 1, dr = 100000;
while(st <= dr){
int mid = (st + dr) / 2;
if(PD(mid))
dr = mid - 1;
else
st = mid + 1;
}
PD(st);
printf("%d\n", st);
DFS(n, l);
return 0;
}