Cod sursa(job #3328022)

Utilizator RaresHRares Hanganu RaresH Data 5 decembrie 2025 21:58:04
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <utility>

FILE* fin;
FILE* fout;

const int MAX_N = 100;
const int MAX_T = 100;
const int MAX_L = 100;
const int INF = 1e9;

struct MyDp {
  int dp;
  int from;
};

int n, l;
int a[MAX_N], b[MAX_N];
MyDp dp[MAX_N + 1][MAX_L + 1];

bool doza(int mij) {
  for(int i = 1; i <= l; i++) {
    dp[0][i] = {-INF, 0};
  }
  dp[0][0] = {0, 0};
  for(int i = 0; i < n; i++) {
    for(int j = 0; j <= l; j++) {
      dp[i + 1][j] = {dp[i][j].dp, j};
    }
    for(int j = 0; j <= mij / a[i]; j++) {
      for(int k = 0; k <= l - j; k++) {
        int val = dp[i][k].dp + (mij - j * a[i]) / b[i];
        if(val > dp[i + 1][k + j].dp) {
          dp[i + 1][k + j] = {val, k};
        }
      }
    }
  }
  return dp[n][l].dp >= l;
}

int main() {
  fin = fopen("lapte.in", "r");
  fout = fopen("lapte.out", "w");

  fscanf(fin, "%d%d", &n, &l);
  for(int i = 0; i < n; i++) {
    fscanf(fin, "%d%d", &a[i], &b[i]);
  }

  int st = 0;
  int dr = MAX_T;
  while(dr - st > 1) {
    int mij = (st + dr) / 2;
    if(doza(mij)) {
      dr = mij;
    } else {
      st = mij;
    }
  }

  fprintf(fout, "%d\n", dr);
  doza(dr);
  std::vector<std::pair<int, int>> ans;
  int i = l;
  for(int ptr = n; ptr >= 1; ptr--) {
    int diff_a = i - dp[ptr][i].from;
    int diff_b = dp[ptr][i].dp - dp[ptr - 1][dp[ptr][i].from].dp;
    ans.push_back({diff_a, diff_b});
    i = dp[ptr][i].from;
  }

  std::reverse(ans.begin(), ans.end());
  for(auto [x, y] : ans) {
    fprintf(fout, "%d %d\n", x, y);
  }

  fclose(fin);
  fclose(fout);

  return 0;
}