Pagini recente » Cod sursa (job #1474028) | Cod sursa (job #2292384) | Cod sursa (job #1721790) | Cod sursa (job #2731376) | Cod sursa (job #2786449)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int maxN=100;
struct bautor {
int a, b;
}v[maxN + 5], c[maxN + 5];
int st, dr, n, L, dp[maxN + 5][maxN + 5], ans, lb, la;
bool valid(int t)
{
memset(dp, 0, sizeof dp);
for(int j = 0; j <= 100; j++)
dp[1][j] = (t - v[1].a * j)/ v[1].b;
for(int i = 2; i <= n; i++)
{
for(int j = 0; j <= 100; j++)
{
for(int k = 0; k <= j; k++)
{
if(dp[i-1][k] < 0)
continue;
if((j - k) / v[i].a > t)
continue;
if((t - ((j - k) * v[i].a)) % v[i].b != 0)
continue;
int val = dp[i-1][k] + (t - ((j - k) * v[i].a))/v[i].b;
dp[i][j] = max(dp[i][j], val);
}
}
}
for(int j = L; j <= 100; j++)
if(dp[n][j] >= L)
return 1;
return 0;
}
int main()
{
fin >> n >> L;
for(int i = 1; i <= n; i++)
fin >> v[i].a >> v[i].b;
st = 1;
dr = L;
while(st <= dr)
{
int med = (st + dr)/2;
if(valid(med))
{
ans = med;
dr = med - 1;
}
else
st = med + 1;
}
fout << ans << '\n';
memset(dp, 0, sizeof dp);
for(int j = 0; j <= 100; j++)
dp[1][j] = (ans - v[1].a * j)/ v[1].b;
for(int i = 2; i <= n; i++)
{
for(int j = 0; j <= 100; j++)
{
for(int k = 0; k <= j; k++)
{
if(dp[i-1][k] < 0)
continue;
if((j - k) / v[i].a > ans)
continue;
if((ans - ((j - k) * v[i].a)) % v[i].b != 0)
continue;
int val = dp[i-1][k] + (ans - ((j - k) * v[i].a))/v[i].b;
dp[i][j] = max(dp[i][j], val);
}
}
}
for(int j = L; j <= 100; j++)
if(dp[n][j] >= L)
{
la = j;
lb = dp[n][j];
break;
}
for(int i = n; i > 0; i--)
{
for(int j = 0; j <= la; j++)
{
if(dp[i-1][j] < 0)
continue;
if((la - j) / v[i].a > ans)
continue;
if((ans - ((la - j) * v[i].a)) % v[i].b != 0)
continue;
if(dp[i][la] == dp[i-1][j] + (ans - ((la - j) * v[i].a))/v[i].b)
{
c[i].a = la - j;
c[i].b = (ans - ((la - j) * v[i].a))/v[i].b;
la = j;
break;
}
}
}
for(int i = 1; i <= n; i++)
fout<<c[i].a<<' '<<c[i].b<<'\n';
return 0;
}