Cod sursa(job #3289223)

Utilizator Victor5539Tanase Victor Victor5539 Data 26 martie 2025 09:44:42
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 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;
bool viz[2*MAX+5][2*MAX+5];
pair <int,int> v[1005];
queue <pair<int,int>> q,Q;

void cpy()
{
    while (!q.empty())
    {
        Q.push({q.front().first,q.front().second});
        q.pop();
    }
}

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

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

void RESET()
{
    for (int i=1; i<=200; i++)
        for (int j=1; j<=200; j++)
            viz[i][j]=0;
}

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)
                return true;

            if (viz[val1][val2]==0)
            {
                viz[val1][val2]=1;
            q.push({val1,val2});
            }
        }

        while (!Q.empty())
        {
            val1=Q.front().first,val2=Q.front().second;
            for (int i2=1; i2<=nr; i2++)
            {
                if (val1+v[i2].first>=l && val2+v[i2].second>=l)
                    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});

                }


            }
            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;


    return 0;
}