Pagini recente » Cod sursa (job #2242416) | Cod sursa (job #762339) | Cod sursa (job #832694) | Cod sursa (job #692910) | Cod sursa (job #186823)
Cod sursa(job #186823)
#include <cstring>
#include <fstream>
using namespace std;
int n,L,i,j,k,t,ls,ld,ta[101],tb[101],a[101],b[101],c[101][200],p[101][200],s;
bool gasit;
ifstream f("lapte.in");
ofstream g("lapte.out");
void prel(){
memset(c,0,sizeof(c));
memset(p,0,sizeof(p));
for (j=0;j*ta[1]<=t;++j) {c[1][j]=(t-ta[1]*j)/tb[1];
p[1][j]=j;}
s=t/ta[1];
for (i=2;i<=n;++i){
for (j=0;j<=s+(t/ta[i]);++j)
{int aux=0,poz=(j-s>0?j-s:0),w;
for (k=(j-s>0?j-s:0);k<=j && k*ta[i]<=t;++k)
if ((w=c[i-1][j-k]+((t-(ta[i]*k))/tb[i])) >aux) {
aux=w;
poz=k;}
c[i][j]=aux;
p[i][j]=poz;}
s+=t/ta[i];
}
}
int main(){
int tt;
f>>n>>L;
for (i=1;i<=n;++i) f>>ta[i]>>tb[i];
ls=1;ld=100;
while (ls<=ld){
t=(ls+ld)/2;
prel();
for (i=L,gasit=false;i<=s && !gasit;++i)
if (c[n][i]>=L ) gasit=true;
if (gasit) {tt=t;
ld=t-1;}
else ls=t+1;
}
t=tt;
prel();
for (i=L,gasit=false;i<=s && !gasit;++i)
if (c[n][i]>=L) {gasit=true;
j=i;}
a[n]=p[n][j];
b[n]=(t-a[n]*ta[n])/tb[n];
g<<t<<'\n';
for (i=n-1;i>0;i--){
j=j-a[i+1];
a[i]=p[i][j];
b[i]=(t-a[i]*ta[i])/tb[i];
}
for (i=1;i<=n;++i)
g<<a[i]<<' '<<b[i]<<'\n';
g.close();
}