Pagini recente » Monitorul de evaluare | Diferente pentru utilizator/stargold2 intre reviziile 97 si 96 | Diferente pentru utilizator/stargold2 intre reviziile 86 si 87 | Profil SebyIliescu | Cod sursa (job #3159969)
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
int n,l;
int dp[101][101];
int venit[101][101];
pair <int,int> v[101];
bool verif(int t)
{
int i,j,k;
for(j=0;j<=l;j++)
if(v[1].first*j<=t)
dp[1][j]=(t-v[1].first*j)/v[1].second;
else
dp[1][j]=-1e9;
for(i=2;i<=n;i++)
for(j=0;j<=l;j++)
dp[i][j]=-1e9;
for(i=2;i<=n;i++)
for(j=0;j<=l;j++)
for(k=0;k<=j;k++)
if(t-v[i].first*(j-k)>=0&&dp[i-1][k]+(t-v[i].first*(j-k))/v[i].second>dp[i][j])
{
dp[i][j]=max(dp[i][j],dp[i-1][k]+(t-v[i].first*(j-k))/v[i].second);
venit[i][j]=k;
}
return dp[n][l]>=l;
}
int cautbin()
{
int r=0,pas=1<<10;
while(pas)
{
if(!verif(r+pas))
r+=pas;
pas/=2;
}
bool x=verif(r+1);
return r+1;
}
pair <int,int> afis[101];
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
int i;
cin>>n>>l;
for(i=1;i<=n;i++)
cin>>v[i].first>>v[i].second;
int r=cautbin();
cout<<r<<'\n';
int start=l;
for(i=n;i>=1;i--)
{
afis[i]={start-venit[i][start],max(0,(r-(start-venit[i][start])*v[i].first)/v[i].second)};
start=venit[i][start];
}
for(i=1;i<=n;i++)
cout<<afis[i].first<<" "<<afis[i].second<<'\n';
return 0;
}