Cod sursa(job #2332877)

Utilizator anamariatoaderAna Toader anamariatoader Data 31 ianuarie 2019 12:57:28
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <cstring>

using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");

int n,L,i,j,l,st,dr,mij,sol,r,d[105][105],tata[105][105];
struct numar{
    int a,b;
}v[105],s[105];
void dinamica(int T){
    for(int i=1;i<=n;i++)
        for(int j=0;j<=L;j++)
            d[i][j]=-1;
    memset(tata,0,sizeof(tata));
    int i,j,k;
    for(i=0;i<=L;i++)
        if(T-i*v[1].a>=0)
          d[1][i]=(T-i*v[1].a)/v[1].b;
    for(i=2;i<=n;i++){
       for(j=0;j<=L;j++){
         for(k=0;k<=j;k++){
            if(d[i][j]<d[i-1][k]+(T-(j-k)*v[i].a)/v[i].b  && (j-k)*v[i].a<=T && d[i-1][k]
               !=-1 ){
                d[i][j]=d[i-1][k]+(T-(j-k)*v[i].a)/v[i].b;
                tata[i][j]=k;
            }
         }
       }
    }
}

int main()
{
    fin>>n>>L;
    for(i=1;i<=n;i++)
        fin>>v[i].a>>v[i].b;
    st=1; dr=101;
    while(st<=dr){
        mij=(st+dr)/2;
        dinamica(mij);
        if(d[n][L]>=L){
            sol=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    fout<<sol<<'\n';
    dinamica(sol);
    l=L;
    for(i=n;i>0;i--){
        s[i].a=l-tata[i][l];
        s[i].b=d[i][l]-d[i-1][tata[i][l]];
        l=tata[i][l];
    }
    for(i=1;i<=n;i++)
        fout<<s[i].a<<' '<<s[i].b<<'\n';
    return 0;
}