Cod sursa(job #1607688)

Utilizator RadduFMI Dinu Radu Raddu Data 21 februarie 2016 15:22:55
Problema Lapte Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define inf 0x3f3f3f
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n,l,ta[105],tb[105];
int dp[105][105],lasta[105][105],lastb[105][105],sx[105],sy[105];

int Ans(int tot)
{ int i,j,k,val,mxa;
   for(i=0;i<=n;i++)
    for(j=0;j<=l;j++)
     dp[i][j]=inf;

   dp[0][0]=0;

 for(i=1;i<=n;i++)
  { mxa=tot/ta[i];

    for(j=0;j<=l;j++)
     for(k=0;k<=min(j,mxa);k++)
       { val=dp[i-1][j-k]+((tot-(ta[i]*k))/tb[i]);

         if (dp[i-1][j-k]!=inf)
           { if (dp[i][j]==inf)
               dp[i][j]=val;
              else
                if (val>dp[i][j]) dp[i][j]=val;
           }
       }
  }

   if (dp[n][l]>=l)
     return 1;

  return 0;
}

void Solve(int tot)
{ int i,j,k,val,mxa,lit,i1,i2;
   for(i=0;i<=n;i++)
    for(j=0;j<=l;j++)
     dp[i][j]=inf;

   dp[0][0]=0;

 for(i=1;i<=n;i++)
  { mxa=tot/ta[i];

    for(j=0;j<=l;j++)
     for(k=0;k<=min(j,mxa);k++)
       { val=dp[i-1][j-k]+((tot-(ta[i]*k))/tb[i]);

         if (dp[i-1][j-k]!=inf)
           { if (dp[i][j]==inf)
               {dp[i][j]=val;
                lasta[i][j]=k;
                lastb[i][j]=((tot-(ta[i]*k))/tb[i]);
               }
               else
               { if (val>dp[i][j])
                 {dp[i][j]=val;
                  lasta[i][j]=k;
                  lastb[i][j]=((tot-(ta[i]*k))/tb[i]);
                 }
               }
           }
       }
  }

 i1=n; i2=l;
 for(;i1>0;)
 { sx[i1]=lasta[i1][i2]; sy[i1]=lastb[i1][i2];
   i2-=lasta[i1][i2]; i1--;
 }

}

int Search()
{ int ok,st=1,dr=100,mid;
    while(st<=dr)
    { mid=(st+dr)/2;
       ok=Ans(mid);
     if (ok) dr=mid-1; else st=mid+1;
    }
    mid=(st+dr)/2;
 if (!Ans(mid)) mid++;

 return mid;
}
int main()
{ int i,sol;
    f>>n>>l;
    for(i=1;i<=n;i++)
     f>>ta[i]>>tb[i];

     sol=Search();
     Solve(sol);

     g<<sol<<"\n";
     for(i=1;i<=n;i++)
      g<<sx[i]<<" "<<sy[i]<<"\n";

    return 0;
}