Pagini recente » Cod sursa (job #1426393) | Cod sursa (job #1400889) | Cod sursa (job #1795342) | Cod sursa (job #2882515) | Cod sursa (job #3129578)
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
const int MAX_N = 100;
const int MAX_L = 100;
const int inf = 1e9;
int n, L, timp;
int dp[MAX_N + 1][MAX_L + 1], ans[MAX_N + 1][MAX_L + 1];
vector <int> a, b;
vector <pair <int, int> > sol, sol1;
void init()
{
for(int i = 0; i <= n; i ++)
for(int j = 0; j <= L; j ++)
dp[i][j] = -inf, ans[i][j] = 0;
}
void rebuildPath(int Time, vector <pair <int, int> > &sol1)
{
int j = L, total = L;
// cout << Time << "\n";
for(int i = n; i >= 1; i --)
{
sol1.pb({(Time - b[i] * (j - ans[i][j])) / a[i], j - ans[i][j]});
// cout << i << " " << j << " " << total << " " << ans[i][j]<< "\n";
j = ans[i][j];
}
// for(auto it = sol1.rbegin(); it != sol1.rend(); it ++)
// cout << it -> first << " " << it -> second << "\n";
// cout << "\n\n";
}
bool ok(int Time, vector <pair <int, int> > &sol1)
{
init();
sol1.clear();
int capat = Time / b[1];
for(int j = 0; j <= capat; j ++ )
dp[1][j] = (Time - b[1] * j)/a[1];
for(int i = 2; i <= n; i ++)
{
dp[i][0] = dp[i - 1][0] + Time / a[i];
int capat = Time / b[i];
for(int j = 1; j <= L; j ++)
{
int inceput = max(0, j - Time / b[i]);
for(int k = inceput; k <= j; k ++)
if(dp[i - 1][k] + (Time - b[i] * (j - k))/a[i] > dp[i][j])
{
dp[i][j] = dp[i - 1][k] + (Time - b[i] * (j - k))/a[i];
ans[i][j] = k;
// cout << i << " " << j << " " << k << " " << ans[i][j] << "\n";
}
}
}
// cout << "\n";
// for(int i = 1; i <= n; i ++)
// {
// for(int j = 0; j <= L; j ++)
// cout << dp[i][j] << " ";
// cout << "\n";
// }
rebuildPath(Time, sol1);
return dp[n][L] >= L;
}
int bs()
{
int st = 1, dr = 200, med, last = -1;
while(st <= dr)
{
int med = (st + dr) / 2;
if(ok(med, sol1))
{
dr = med - 1;
last = med;
sol = sol1;
}
else
st = med + 1;
}
return last;
}
int main()
{
ios_base :: sync_with_stdio(0);
cin.tie(0);
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
cin >> n >> L;
a.resize(n + 1);
b.resize(n + 1);
for(int i = 1; i <= n; i ++)
cin >> a[i] >> b[i];
int timp = bs();
cout << timp << "\n";
// rebuildPath();
for(auto it = sol.rbegin(); it != sol.rend(); it ++)
cout << it -> first << " " << it -> second << "\n";
// for(int i = 1; i <= 20; i ++)
// {
// cout << i << " " << ok(i) << "\n";
// }
// int x = ok(18);
return 0;
}