Pagini recente » Cod sursa (job #2947223) | Cod sursa (job #427019) | Cod sursa (job #2225541) | Cod sursa (job #1837946) | Cod sursa (job #2918296)
#include <fstream>
#import <algorithm>
#import <vector>
#import <map>
#import <deque>
#import <cassert>
using namespace std;
vector<pair<int,int>>a;
vector<int>sol;
int n,k,l;
int ok(int x)
{
vector<int>dp(k+1,-2e9);
dp[0]=0;
vector<vector<int>>h(k+1);
for(auto &c:h)
{
c.resize(n);
}
int nvm=0;
for(const auto &c:a)
{
vector<int>_dp=dp;
vector<vector<int>>_h=h;
dp=vector<int>(k+1,0);
int j=0;
while(c.first*j<=x)
{
int rest=(x-c.first*j)/c.second;
for(int i=k;i>=0;i--)
{
if(j<i)
{
if(_dp[i-j]+rest>dp[i])
{
dp[i]=_dp[i-j]+rest;
h[i]=_h[i-j];
h[i][nvm]=j;
}
}
else
{
if(_dp[0]+rest>dp[i])
{
dp[i]=rest+_dp[0];
h[i]=_h[0];
h[i][nvm]=j;
}
}
}
j++;
}
nvm++;
}
if(dp[k]>=k)
{
sol=h[k];
return 1;
}
return 0;
}
int caut()
{
int rez=-1,st=1,dr=100;
while(st<=dr)
{
int m=(st+dr)/2;
if(ok(m))
{
dr=m-1;
rez=m;
}
else
{
st=m+1;
}
}
return rez;
}
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;
}
main()
{
ifstream cin("lapte.in");
ofstream cout("lapte.out");
cin>>n>>k;
a.resize(n);
for(int i=0;i<n;i++)
{
cin>>a[i].first>>a[i].second;
v[i+1]=a[i];
}
l=k;
int rez=caut();
int rez2=cautbin();
assert(rez==rez2);
cout<<rez<<'\n';
for(int i=0;i<n;i++)
{
int c=sol[i];
cout<<c<<' '<<(rez-c*a[i].first)/a[i].second<<'\n';
}
}