Pagini recente » Cod sursa (job #2429302) | Cod sursa (job #2583191) | Cod sursa (job #3252341) | Cod sursa (job #2973609) | Cod sursa (job #3289223)
#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;
}