Pagini recente » Cod sursa (job #2510096) | Cod sursa (job #2587732) | Cod sursa (job #1660566) | Cod sursa (job #2497753) | Cod sursa (job #3152362)
#include <fstream>
#include <stack>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int dp[105][105],pre[105][105];
pair<int, int> timp[105];
stack<int> stk;
int main()
{
int n,t,l,st,dr,mid;
fin >> n >> l;
for(int i=1;i<=n;i++)
fin >> timp[i].first >> timp[i].second;
st = 1; dr = 100; t = 100;
while(st<=dr){
mid = (st+dr)/2;
int var = 0;
for(int i=1;i<=n;i++){
int xm = mid/(timp[i].first);
for(int j=0;j<=min(100,var+xm);j++){
dp[i][j] = 0;
for(int x=max(0,j-var);x<=min(xm,j);x++){
if(dp[i][j]<dp[i-1][j-x]+(mid-x*timp[i].first)/(timp[i].second))
dp[i][j] = dp[i-1][j-x]+(mid-x*timp[i].first)/(timp[i].second);
}
}
var+=xm; var = min(var, 100);
}
if(dp[n][l]>=l){
t = mid;
dr = mid-1;
}
else
st = mid+1;
}
fout << t << '\n';
int var = 0;
for(int i=1;i<=n;i++){
int xm = t/(timp[i].first);
for(int j=0;j<=min(100,var+xm);j++){
dp[i][j] = 0;
for(int x=max(0,j-var);x<=min(xm,j);x++){
if(dp[i][j]<dp[i-1][j-x]+(t-x*timp[i].first)/(timp[i].second)){
dp[i][j] = dp[i-1][j-x]+(t-x*timp[i].first)/(timp[i].second);
pre[i][j] = x;
}
}
}
var+=xm; var = min(var, 100);
}
var = l;
for(int i=n;i>0;i--){
int x = pre[i][var];
var-=x;
stk.push(x);
}
for(int i=1;i<=n;i++){
int x = stk.top();
fout << x << " ";
int nr = (t-x*timp[i].first)/(timp[i].second);
fout << nr << '\n';
stk.pop();
}
return 0;
}