Pagini recente » Cod sursa (job #168500) | Cod sursa (job #898994) | Cod sursa (job #2439356) | Cod sursa (job #2592670) | Cod sursa (job #472604)
Cod sursa(job #472604)
#include <cstdio>
#include <algorithm>
using namespace std;
#define NMAX 105
const int LMAX = 105;
#define TMAX 101
int N, L, T;
struct timpi
{
int a,b;
}e[NMAX];
pair<int, int> lapte[NMAX][LMAX];
void citire()
{
scanf("%d %d",&N,&L);
for(int i = 1 ; i <= N ; i++)
scanf("%d %d", &e[i].a, &e[i].b);
}
int ok(int timp)
{
bool viz[NMAX][LMAX];
for(int i = 0 ; i <= N ; i++)
for(int j = 0 ; j <= L ; j++)
{
lapte[i][j].first = 0;
lapte[i][j].second = 0;
viz[i][j] = 0;
}
for(int j = 0 ; j <= L ; j++)
{
if(j * e[1].a > timp)
break;
lapte[1][j].first = (timp - (j * e[1].a)) / e[1].b;
viz[1][j] = 1;
}
for(int i = 1 ; i < N ; i++)
for(int j = 0 ; j <= L ; j++)
if(viz[i][j])
for(int k = 0 ; j + k <= L && k * e[i + 1].a <= timp ; k++)
if(lapte[i][j].first + (timp - (k * e[i + 1].a)) / e[i + 1].b > lapte[i + 1][j + k].first)
{
lapte[i + 1][j + k].first = lapte[i][j].first + (timp - (k * e[i + 1].a)) / e[i + 1].b;
lapte[i + 1][j + k].second = j;
viz[i + 1][j + k] = 1;
}
if(lapte[N][L].first >= L)
return 1;
return 0;
}
void cautare_bin()
{
int p=1;
while((p<<1)<TMAX)
p<<=1;
while(p)
{
if(!ok(T+p))
T+=p;
p>>=1;
}
ok(++T);
}
void scrie()
{
pair<int, int> rez[NMAX];
int j = L;
for(int i = N ; i ; i--)
{
rez[i].first = j - lapte[i][j].second;
rez[i].second = lapte[i][j].first - lapte[i - 1][lapte[i][j].second].first;
j = lapte[i][j].second;
}
printf("%d\n", T);
for(int i = 1 ; i <= N; i++)
printf("%d %d\n", rez[i].first, rez[i].second);
}
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
citire();
cautare_bin();
scrie();
return 0;
}