Cod sursa(job #3190948)

Utilizator Cazacu2006RazvanRazvan Cazacu Cazacu2006Razvan Data 8 ianuarie 2024 14:17:25
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n,L,T,tata[101][101],d[101][101],poz;
struct numar
{
    int x,y;
}v[101];
int solve(int val)
{
    memset(tata,0,sizeof(tata));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=L;j++)
        d[i][j]=-1;
    for(int i=0;i<=L;i++)
    {
        ///cantitatea de lapte A bauta de primul
        if(i*v[1].x<=val)
        {
            d[1][i]=(val-i*v[1].x)/v[1].y;
        }
        else
            break;
    }

    for(int i=2;i<=n;i++)
    {

        for(int j=0;j<=L;j++)
        {
            for(int k=0;k<=j;k++)
            {
                if(d[i][k]!=-1 && (j-k)*v[i].x<=val)
                {
                    if(d[i][j]<d[i-1][k]+(val-(j-k)*v[i].x)/v[i].y)
                     {
                         d[i][j]=d[i-1][k]+(val-(j-k)*v[i].x)/v[i].y;
                         tata[i][j]=k;
                     }
                }

            }
        }

    }
    return d[n][L];

}
void rec(int lin,int col)
{
    if(lin>=1)
    {
        rec(lin-1,tata[lin][col]);
        fout<<col-tata[lin][col]<<" "<<d[lin][col]-d[lin-1][tata[lin][col]]<<"\n";
    }


}
int main()
{
    fin>>n>>L;
    for(int i=1;i<=n;i++)
    {
        fin>>v[i].x>>v[i].y;

    }
    int st=1,dr=100,mid;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        int ok=solve(mid);
        //fout<<ok<<" ";
        if(ok>=L)
        {
            dr=mid-1;
            poz=mid;
        }
        else
            st=mid+1;
    }
    fout<<poz<<"\n";
    solve(poz);
    rec(n,L);

    return 0;
}