Cod sursa(job #1133694)

Utilizator DanyPrvPirvoaica Daniel DanyPrv Data 5 martie 2014 12:59:56
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int v[101][101],c[101][101],csol[101][101],i,j,n,l,st,dr,t,a[101],b[101],k,sol,x[102],y[102];
int dinamica(int t){
    for(i=1;i<=n;i++)
        for(j=0;j<=l;j++)
            v[i][j]=-1;
    memset(c,0,sizeof(c));
    for(i=0;i<=l&&i<=t/a[1];i++)
      {
        v[1][i]=(t-i*a[1])/b[1];
        c[1][i]=0;
      }

    for(i=2;i<=n;i++){
      for(j=0;j<=l;j++)
        for(k=0;k<=j;k++)
          if(v[i-1][k]!=-1&&(j-k)>=0&&(j-k)*a[i]<=t&&v[i][j]<v[i-1][k]+(t-(j-k)*a[i])/b[i]){
           v[i][j]=v[i-1][k]+(t-(j-k)*a[i])/b[i];
           c[i][j]=k;
        }
    }
      return v[n][l]>=l;
}
int main()
{
    f>>n>>l;
    for(i=1;i<=n;i++)
        f>>a[i]>>b[i];
    st=1;sol=0;
    dr=10000;
    while(st<=dr){
        t=(st+dr)/2;
        if(dinamica(t)>0){
            sol=t;
            memcpy(csol,c,sizeof(c));
            dr=t-1;
        }
        else
            st=t+1;
    }
    g<<sol<<'\n';
    for(i=n;i>=1;i--){
       x[i]=l-csol[i][l];
       y[i]=(sol-x[i]*a[i])/b[i];
       l=csol[i][l];

    }
    for(i=1;i<=n;i++)
        g<<x[i]<<' '<<y[i]<<'\n';
    return 0;
}