Pagini recente » Cod sursa (job #406271) | Cod sursa (job #1318342) | Cod sursa (job #845541) | Cod sursa (job #35289) | Cod sursa (job #84918)
Cod sursa(job #84918)
#include <cstdio>
#define NMAX 105
int N,L,timp=101;
short int a[NMAX],b[NMAX];
short int MAX[NMAX][NMAX],added[NMAX][NMAX];
short int sol[NMAX][NMAX];
void read_data()
{
scanf("%d %d",&N,&L);
for(int i=1;i<=N;i++)
scanf("%hd %hd",&a[i],&b[i]);
}
bool verif(int T)
{
int i,j,tlast;
for(i=0;i<=N;i++)
for(j=0;j<=L;j++)
MAX[i][j]=-1;
MAX[0][0]=0;
for(i=1;i<=N;i++)
for(j=0;j<=L;j++)
for(tlast=0;(tlast<=T)&&(j-tlast/a[i]>=0);tlast++)
if(MAX[i-1][j-tlast/a[i]]!=-1 && MAX[i][j]<MAX[i-1][j-tlast/a[i]]+(T-tlast)/b[i])
{
MAX[i][j]=MAX[i-1][j-tlast/a[i]]+(T-tlast)/b[i];
added[i][j]=tlast;
}
return (MAX[N][L]>=L);
}
int binary_search(int li, int ls)
{
if(li>ls)
return -1;
if(verif((li+ls)/2))
{
if(timp>(li+ls)/2)
{
timp=(li+ls)/2;
for(int i=0;i<=N;i++)
for(int j=0;j<=L;j++)
sol[i][j]=added[i][j];
}
int aux=binary_search(li,(li+ls)/2-1);
return (aux!=-1)?aux:((li+ls)/2);
}
else
return binary_search((li+ls)/2+1,ls);
}
void recursive_solution(int N, int p)
{
if(N>1)
recursive_solution(N-1,p-sol[N][p]/a[N]);
printf("%d %d\n",sol[N][p]/a[N],(timp-sol[N][p])/b[N]);
}
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
read_data();
binary_search(1,100);
printf("%d\n",timp);
recursive_solution(N,L);
return 0;
}