Pagini recente » Cod sursa (job #2439438) | Cod sursa (job #21927) | Cod sursa (job #3178080) | Cod sursa (job #983544) | Cod sursa (job #2890958)
//Ilie Dumitru
#include<cstdio>
#include<vector>
typedef long long int ll;
const int NMAX=105;
const ll MOD=1000000007;
FILE* f=fopen("lapte.in", "r"), *g=fopen("lapte.out", "w");
int N, L, A[NMAX], B[NMAX], min[NMAX];
int prev[NMAX][NMAX], cntA[NMAX][NMAX];
bool solve(int T)
{
int i, j, k, b;
for(i=1;i<=L;++i)
min[i]=-1;
min[0]=0;
for(j=0;j<N;++j)
for(i=L-1;i>-1;--i)
{
if(min[i]!=-1)
{
for(k=1;k*A[j]<=T && k+i<=L;++k)
{
b=(T-k*A[j])/B[j];
if(b+min[i]>min[i+k])
min[i+k]=b+min[i];
}
b=T/B[j];
min[i]+=b;
}
}
return min[L]>=L;
}
void solve_1(int T)
{
int i, j, k, b;
for(i=1;i<=L;++i)
min[i]=-1;
min[0]=0;
for(j=0;j<N;++j)
for(i=L-1;i>-1;--i)
{
if(min[i]!=-1)
{
for(k=1;k*A[j]<=T && k+i<=L;++k)
{
b=(T-k*A[j])/B[j];
if(b+min[i]>min[i+k])
{
min[i+k]=b+min[i];
prev[i+k][min[i+k]]=j;
cntA[i+k][min[i+k]]=k;
}
}
b=T/B[j];
min[i]+=b;
prev[i][min[i]]=j;
cntA[i][min[i]]=0;
}
}
}
int ans[NMAX][2];
int main()
{
int i, l=0/*T=l secunde e insuficient*/, r=101/*T=r secunde e suficient*/, m;
fscanf(f, "%d%d", &N, &L);
for(i=0;i<N;++i)
fscanf(f, "%d%d", A+i, B+i);
while(r-l>1)
{
m=(l+r)>>1;
if(solve(m))
r=m;
else
l=m;
}
fprintf(g, "%d\n", r);
solve_1(r);
int a=L, b=min[L], ma, mb;
while(a || b)
{
ma=cntA[a][b];
mb=(r-ma*A[prev[a][b]])/B[prev[a][b]];
ans[prev[a][b]][0]=ma;
ans[prev[a][b]][1]=mb;
a-=ma;
b-=mb;
}
for(i=0;i<N;++i)
fprintf(g, "%d %d\n", ans[i][0], ans[i][1]);
fclose(f);
fclose(g);
return 0;
}