Pagini recente » Cod sursa (job #209591) | Cod sursa (job #248478) | Borderou de evaluare (job #2611139) | Cod sursa (job #770609) | Cod sursa (job #3317136)
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <unordered_set>
#include <numeric>
#include "stdio.h"
using namespace std;
#define ll long long
const int inf = 0x3f3f3f3f;
int n, k;
int a[100], b[100];
pair<int,int> cap(int w, int t, int u) {
int r1 = min(u, t/a[w]);
int r2 = (t-a[w]*r1)/b[w];
return {r1, r2};
}
void solve() {
cin >> n >> k;
for(int i=0;i<n;i++) {
cin >> a[i] >> b[i];
}
int ret = 0;
for(int dt = 1 << 8;dt;dt>>=1) {
int t = ret + dt;
int dp[101][101]{};
int dpp[101][101]{};
for(int j=0;j<=k;j++) {
if(a[0]*j > t) {
dp[0][j] = -1;
continue;
}
pair<int, int> c = cap(0, t, j);
dp[0][j] = c.second;
dpp[0][j] = 0;
}
for(int i=1;i<n;i++) {
for(int j=0;j<=k;j++) {
int max = -1;
int maxi = -1;
for(int h=0;h<=j;h++) {
int ureq = j-h;
pair<int, int> c = cap(i, t, h);
if(h != c.first) break;
if(dp[i-1][ureq] == -1) {
continue;
}
int v = dp[i-1][ureq] + c.second;
if(v > max) {
max = v;
maxi = ureq;
}
}
dp[i][j] = max;
dpp[i][j] = maxi;
}
}
if(dp[n-1][k] < k) {
ret += dt;
}
}
int t = ret + 1;
int dp[101][101]{};
int dpp[101][101]{};
for(int j=0;j<=k;j++) {
if(a[0]*j > t) {
dp[0][j] = -1;
continue;
}
pair<int, int> c = cap(0, t, j);
dp[0][j] = c.second;
dpp[0][j] = 0;
}
for(int i=1;i<n;i++) {
for(int j=0;j<=k;j++) {
int max = -1;
int maxi = -1;
for(int h=0;h<=j;h++) {
int ureq = j-h;
pair<int, int> c = cap(i, t, h);
if(h != c.first) break;
if(dp[i-1][ureq] == -1) {
continue;
}
int v = dp[i-1][ureq] + c.second;
if(v > max) {
max = v;
maxi = ureq;
}
}
dp[i][j] = max;
dpp[i][j] = maxi;
}
}
vector<pair<int, int>> out;
int lk = k;
for(int p=n-1;p>=0;p--) {
int ureq = dpp[p][lk];
int loc = lk - ureq;
pair<int, int> c = cap(p, t, loc);
out.push_back(c);
lk = ureq;
}
cout << t << "\n";
for(int i=out.size()-1;i>=0;i--) {
cout << out[i].first << " " << out[i].second << "\n";
}
}
int main() {
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
#ifdef INFOARENA
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
#endif //INFOARENA
solve();
}