Pagini recente » Cod sursa (job #2488614) | Cod sursa (job #394757) | Cod sursa (job #2090029) | Cod sursa (job #464848) | Cod sursa (job #3289225)
#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;
}