Pagini recente » Cod sursa (job #1681782) | Cod sursa (job #1825483) | Cod sursa (job #513938) | Cod sursa (job #1566213) | Cod sursa (job #472628)
Cod sursa(job #472628)
#include <cstdio>
#include <algorithm>
using namespace std;
#define NMAX 105
const int LMAX = 105;
#define TMAX 105
int N, L, T;
struct timpi
{
int a,b;
}e[NMAX];
pair<int, int> lapte[NMAX][LMAX];
void write()
{
for(int i = 1 ; i <= N ; i++)
{
for(int j = 1 ; j <= L ; j++)
printf("%d(%d) ", lapte[i][j].first, lapte[i][j].second);
printf("\n");
}
printf("\n\n\n");
}
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)
{
int lim[NMAX];
for(int i = 0 ; i <= N ; i++)
for(int j = 0 ; j <= L ; j++)
{
lapte[i][j].first = 0;
lapte[i][j].second = 0;
}
lim[0] = 0;
for(int i = 1 ; i <= N ; i++)
lim[i] = lim[i - 1] + timp / e[i].a;
for(int j = 0 ; j <= lim[1] ; j++)
lapte[1][j].first = (timp - (j * e[1].a)) / e[1].b;
for(int i = 2 ; i <= N ; i++)
for(int j = 0 ; j <= lim[i] ; j++)
for(int k = 0 ; k <= min(j, timp / e[i].a) ; k++)
if(j - k <= lim[i - 1])
if(lapte[i - 1][j - k].first + (timp - (k * e[i].a)) / e[i].b > lapte[i][j].first)
{
lapte[i][j].first = lapte[i - 1][j - k].first + (timp - (k * e[i].a)) / e[i].b;
lapte[i][j].second = j - k;
}
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);
//write();
}
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;
}