Pagini recente » Cod sursa (job #1509509) | Cod sursa (job #2383678) | Cod sursa (job #2637958) | Cod sursa (job #2526229) | Cod sursa (job #2879978)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n, l;
struct elem
{
int lapte_A, lapte_B;
};
struct elem_dp
{
int val, lapte_A;
};
elem timp[105];
elem ras[105];
int rasp=-1;
elem_dp dp[105][105];
bool verif(int x)
{
for(int i=0;i<=l;i++)
{
for(int j=0;j<=n;j++)
{
dp[i][j].val=-1;
}
}
dp[0][0].val=0;
for(int ind_pers=1;ind_pers<=n;ind_pers++)
{
for(int st=0;st<=l;st++)
{
for(int st2=0;st2<=st;st2++)
{
if(dp[st2][ind_pers-1].val==-1)
{
continue;
}
int timp_lapte_A=(st-st2)*timp[ind_pers].lapte_A;
if(x<timp_lapte_A)
{
continue;
}
int timp_lapte_B=x-timp_lapte_A;
int lapte_baut=timp_lapte_B/timp[ind_pers].lapte_B;
if(dp[st][ind_pers].val<dp[st2][ind_pers-1].val+lapte_baut)
{
dp[st][ind_pers].val=dp[st2][ind_pers-1].val+lapte_baut;
dp[st][ind_pers].lapte_A=st-st2;
}
}
}
}
//cout<<l<<' '<<n<<' '<<x<<' '<<dp[l][n]<<endl;
return dp[l][n].val>=l;
}
void caut_binar_timp_min()
{
int st=0, dr=105;
int mij;
while(st<=dr)
{
mij=(st+dr)/2;
if(verif(mij))
{
rasp=mij;
dr=mij-1;
}
else
{
st=mij+1;
}
}
}
int main()
{
fin>>n>>l;
for(int i=1;i<=n;i++)
{
int x, y;
fin>>x>>y;
timp[i].lapte_A=x;
timp[i].lapte_B=y;
}
caut_binar_timp_min();
fout<<rasp<<'\n';
verif(rasp);
for(int i=1;i<=n;i++)
{
//dp[l][n] --> dp[l-dp[l][n].lapte_A][n-1]
//fout<<dp[l][i].lapte_A<<' '<<dp[l][i].lapte_B<<'\n';
}
int lap_A=l, lap_B=l;
for(int i=n;i>0;i--)
{
for(int j=0;j<=min(lap_A, rasp/timp[i].lapte_A);j++)
{
int val=(rasp-(j*timp[i].lapte_A))/timp[i].lapte_B;
if(dp[i-1][lap_A-j].val+val>=lap_B)
{
ras[i].lapte_A=j;
ras[i].lapte_B=val;
lap_A=lap_A-j;
lap_B=lap_B-val;
break;
}
}
}
for(int i=1;i<=n;i++)
{
fout<<ras[i].lapte_A<<' '<<ras[i].lapte_B<<'\n';
}
return 0;
}