Pagini recente » Cod sursa (job #2207455) | Cod sursa (job #2549107) | Cod sursa (job #245393) | Cod sursa (job #2203335) | Cod sursa (job #1021375)
#include <fstream>
#define MAXN 105
#define MAXL 105
#define INF 2000000
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n,l,ta[MAXN],tb[MAXN],st,dr,mij,pd[MAXL],v[MAXL],back[MAXL][MAXN],x,pant,sol[MAXN][2];
bool merge(int t);
void afisare(int p,int q);
int main()
{
int i;
f>>n>>l;
for(i=1;i<=n;i++)
f>>ta[i]>>tb[i];
st=0;dr=(ta[1]+tb[1])*l;
while(st<dr){
mij=(st+dr)/2;
if(merge(mij))
dr=mij-1;
else
st=mij+1;}
while(!merge(st))
st++;
g<<st<<'\n';
merge(st);
for(i=n;i>=1;i--){
if(back[l][i]==-1)
continue;
x=l-back[l][i];
sol[i][0]=x;
sol[i][1]=(st-x*ta[i])/tb[i];
l=back[l][i];}
for(i=1;i<=n;i++)
g<<sol[i][0]<<' '<<sol[i][1]<<'\n';
f.close();
g.close();
return 0;
}
bool merge(int t){
int i,j,k;
for(i=1;i<=l;i++)
pd[i]=-INF;
pd[0]=0;
for(i=0;i<=l;i++)
for(j=1;j<=n;j++)
back[i][j]=-1;
for(i=1;i<=n;i++){
for(j=0;j<=l;j++){
if(t-j*ta[i]<0)
v[j]=-1;
else
v[j]=(t-j*ta[i])/tb[i];}
for(j=l;j>=0;j--){
if(pd[j]==-INF)
continue;
for(k=l-j;k>=0;k--){
if(v[k]<0)
continue;
if(pd[j]+v[k]>pd[j+k]){
pd[j+k]=pd[j]+v[k];
back[j+k][i]=j;}}}}
if(pd[l]>=l)
return 1;
return 0;}