Submission #983310

#TimeUsernameProblemLanguageResultExecution timeMemory
983310NeroZeinSki 2 (JOI24_ski2)C++17
0 / 100
70 ms100192 KiB
#include "bits/stdc++.h"
using namespace std;

#ifdef Nero
#include "Deb.h"
#else
#define debug(...)
#endif

const int N = 42;
const long long INF = 1e15;

int n, k;
int h[N], c[N];
int cnt[N * 2];
int prefsum[N * 2];
int prefcnt[N * 2];
int pref[N * 2 + 1];//mnC
long long dp[N * 2 + 1][N][N][N];

void init() {
  prefcnt[0] = cnt[0];
  for (int i = 1; i < N * 2; ++i) {
    prefcnt[i] = cnt[i] + prefcnt[i - 1]; 
    prefsum[i] += prefsum[i - 1];
  }
  for (int i = 1; i < N * 2; ++i) {
    if (pref[i - 1] == 0) continue; 
    if (pref[i] == 0 || (c[pref[i]] > c[pref[i - 1]])) {
      pref[i] = pref[i - 1]; 
    }
  }
  for (int height = 0; height < N * 2; ++height) {
    for (int available = 0; available < n; ++available) {
      for (int carry = 0; carry < n; ++carry) {
        for (int mn = 0; mn <= n; ++mn) {
          dp[height][available][carry][mn] = INF;
        }
      }
    }
  }    
  for (int i = 1; i <= n; ++i) {
    dp[h[i] + 1][1][prefcnt[h[i]] - 1][i] = ((prefcnt[h[i]] - 1) * (h[i] + 1) - (prefsum[h[i]] - h[i])) * k;
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> n >> k;
  for (int i = 1; i <= n; ++i) {
    cin >> h[i] >> c[i]; 
    cnt[h[i]]++;
    prefsum[h[i]] += h[i];
    if (pref[h[i]] == 0 || c[pref[h[i]]] > c[i]) {
      pref[h[i]] = i; 
    }
  }
  init();
  for (int height = 0; height < N * 2; ++height) {
    for (int available = 0; available < n; ++available) {
      for (int carry = 0; carry < n; ++carry) {
        for (int mn = 1; mn <= n; ++mn) {
          int t = carry + cnt[height];
          for (int i = 0; i <= max(0, t - available); ++i) {
            int ncarry = carry - i + cnt[height];
            int navailable = available + i;
            int nmn = (i == 0 ? mn : pref[height]);
            if (available && ncarry) {
              int tmp = min(ncarry, available);
              ncarry -= tmp; 
              nmn = pref[height];
            }
            long long cost = ncarry * k + i * c[mn];
            dp[height + 1][navailable][ncarry][nmn] = min(dp[height + 1][navailable][ncarry][nmn], dp[height][available][carry][mn] + cost);
          }
        }
      }
    }
  }
  long long ans = LLONG_MAX;
  for (int available = 1; available < n; ++available) {
    ans = min(ans, dp[N * 2 - 1][available][0][pref[N * 2 - 1]]);
  }
  cout << ans << '\n';
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...