Pagini recente » Cod sursa (job #953507) | Monitorul de evaluare | Cod sursa (job #1331309) | Istoria paginii runda/simulare-cartita-34/clasament | Cod sursa (job #2223071)
#include<bits/stdc++.h>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n,l;
struct milk
{
int a,b;
};
milk v[102];
bool dp[102][102];
int aa[102][102],bb[102][102];
int du[102][102];
bool check(int maxx)
{
memset(dp,0,sizeof(dp));
memset(du,0,sizeof(du));
memset(aa,0,sizeof(aa));
memset(bb,0,sizeof(bb));
dp[l][l]=1;
for(int i=1;i<=n;++i)
{
vector<pair<int,int> >a;
int xx=maxx/v[i].a;
int yy=(maxx-(xx*v[i].a))/v[i].b;
while(xx)
{
a.push_back({xx,yy});
int pp;
do{
--xx;
pp=xx*v[i].a+yy*v[i].b;
}while(xx && maxx-pp<v[i].b);
while(xx*v[i].a+(yy+1)*v[i].b<=maxx)
++yy;
}
a.push_back({xx,yy});
for(int j=0;j<=l;++j)
for(int k=0;k<=l;++k)
{
if(!dp[j][k])
continue;
for(int p=0;p<a.size();++p)
{
if(dp[max(0,j-a[p].first)][max(0,k-a[p].second)])
continue;
dp[max(0,j-a[p].first)][max(0,k-a[p].second)]=1;
du[max(0,j-a[p].first)][max(0,k-a[p].second)]=i;
aa[max(0,j-a[p].first)][max(0,k-a[p].second)]=a[p].first;
bb[max(0,j-a[p].first)][max(0,k-a[p].second)]=a[p].second;
}
}
if(dp[0][0])
return 1;
}
return 0;
}
struct ss
{
int a,b;
};
ss aaaa[102];
int main()
{
f>>n>>l;
for(int i=1;i<=n;++i)
f>>v[i].a>>v[i].b;
int b=1;
int e=101;
int sol=0;
while(b<=e)
{
int mid=(b+e)/2;
if(check(mid))
sol=mid,e=mid-1;
else
b=mid+1;
}
check(sol);
int p=0;
int q=0;
while(!(p==l && q==l))
{
aaaa[du[p][q]]={aa[p][q],bb[p][q]};
int x=aa[p][q];
int y=bb[p][q];
p+=x;
q+=y;
}
g<<sol<<'\n';
for(int i=1;i<=n;++i)
g<<aaaa[i].a<<" "<<aaaa[i].b<<'\n';
return 0;
}