Cod sursa(job #3289225)

Utilizator Victor5539Tanase Victor Victor5539 Data 26 martie 2025 09:50:14
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.77 kb
#include <iostream>
#include <fstream>
#include <queue>

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

const int MAX=100;
int n,i,a[MAX+5],b[MAX+5],l,st,dr,mij,sol,j,val1,val2,nr,pas,x,y;
pair <int,int> v[1005];
pair <int,int> ans[1005];
bool viz[2*MAX+5][2*MAX+5];


struct W
{
    int s1,s2;
    int pas;
};
queue <W> q,Q;
struct elem
{
    bool exist;
    int pasanterior,a,b;
} dp[MAX+5][2*MAX+5][2*MAX+5];


void RESET()
{
    for (int i=1; i<=200; i++)
        for (int j=1; j<=200; j++)
            viz[i][j]=0;
}
void cpy()
{
    while (!q.empty())
    {
        Q.push({q.front().s1,q.front().s2,q.front().pas});
        q.pop();
    }
}

void resetq()
{
    while (!q.empty())
        q.pop();
}

void resetQ()
{
    while (!Q.empty())
        Q.pop();
}

bool verif(int timp)
{
    int i,j;
    resetq();
    resetQ();
    RESET();
    for (i=1; i<=n; i++)
    {
        nr=0;

        for (j=0; j<=timp/a[i]; j++)
        {
            val1=j;
            val2=(timp-j*a[i])/b[i];
            v[++nr].first=val1;
            v[nr].second=val2;


            if (val1>=l && val2>=l)
            {
                x=val1;
                y=val2;
                dp[i][val1][val2].exist=1;
                dp[i][val1][val2].pasanterior=-1;
                dp[i][val1][val2].a=val1;
                dp[i][val1][val2].b=val2;
                return true;
            }

            if (viz[val1][val2]==0)
            {viz[val1][val2]=1;
            q.push({val1,val2,i});
            dp[i][val1][val2].exist=1;
            dp[i][val1][val2].pasanterior=-1;
            dp[i][val1][val2].a=val1;
            dp[i][val1][val2].b=val2;
            }
        }

        while (!Q.empty())
        {
            val1=Q.front().s1;
            val2=Q.front().s2;
            pas=Q.front().pas;
            for (int i2=1; i2<=nr; i2++)
            {
                if (val1+v[i2].first>=l && val2+v[i2].second>=l)
                {
                    x=val1+v[i2].first;
                    y=val2+v[i2].second;
                    dp[i][val1+v[i2].first][val2+v[i2].second].exist=1;
                    dp[i][val1+v[i2].first][val2+v[i2].second].pasanterior=pas;
                    dp[i][val1+v[i2].first][val2+v[i2].second].a=v[i2].first;
                    dp[i][val1+v[i2].first][val2+v[i2].second].b=v[i2].second;
                    return true;
                }

                if (viz[val1+v[i2].first][val2+v[i2].second]==0)
                {viz[val1+v[i2].first][val2+v[i2].second]=1;
                q.push({val1+v[i2].first,val2+v[i2].second,i});
                dp[i][val1+v[i2].first][val2+v[i2].second].exist=1;
                dp[i][val1+v[i2].first][val2+v[i2].second].pasanterior=pas;
                dp[i][val1+v[i2].first][val2+v[i2].second].a=v[i2].first;
                dp[i][val1+v[i2].first][val2+v[i2].second].b=v[i2].second;
                }
            }
            Q.pop();
        }

        cpy();
    }
    return false;
}
int main()
{
    fin>>n>>l;

    for (i=1; i<=n; i++)
        fin>>a[i]>>b[i];




    st=1;
    dr=100;
    while (st<=dr)
    {
        int mij=(st+dr)>>1;

        if (verif(mij))
        {
            sol=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }

    fout<<sol<<"\n";
    i=n;

     while (x>0 && y>0)
    {
        val1=dp[i][x][y].a;
        val2=dp[i][x][y].b;
        pas=dp[i][x][y].pasanterior;
        ans[i].first=val1;
        ans[i].second=val2;
        x-=val1;
        y-=val2;
        i=pas;

        if (i==-1)
            break;
    }

    for (i=1; i<=n; i++)
        fout<<ans[i].first<<" "<<ans[i].second<<"\n";




    return 0;
}