Submission #1036883

#TimeUsernameProblemLanguageResultExecution timeMemory
1036883juicyLet's Win the Election (JOI22_ho_t3)C++17
100 / 100
161 ms2448 KiB
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif

const int N = 505, inf = 1e9;

int n, k;
int a[N], b[N], ord[N];
double dp[N][N];

double solve(int m) {
  for (int i = 0; i <= n; ++i) {
    fill(dp[i], dp[i] + k + 1, inf);
  }
  dp[0][0] = 0;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j <= min(i, k - m); ++j) {
      if (dp[i][j] != inf) {
        int id = ord[i + 1];
        if (j + 1 <= k - m) {
          dp[i + 1][j + 1] = min(dp[i + 1][j + 1], dp[i][j] + (double) a[id] / (m + 1));
        }
        int pick = i - j;
        if (m - pick > 0) {
          if (b[id] != inf) {
            dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + (double) b[id] / (pick + 1));
          }
        } else {
          dp[i + 1][j] = min(dp[i + 1][j], dp[i][j]);
        }
      }
    }
  }
  return dp[n][k - m];
}

int main() {
  ios::sync_with_stdio(false); cin.tie(nullptr);


  cin >> n >> k;
  int can = n;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i] >> b[i];
    if (b[i] == -1) {
      b[i] = inf;
      --can;
    } 
  }
  iota(ord + 1, ord + n + 1, 1);
  sort(ord + 1, ord + n + 1, [&](int i, int j) {
    return b[i] < b[j];
  });
  double res = solve(1);;
  for (int cnt = 0; cnt <= min(can, k); ++cnt) {
    res = min(res, solve(cnt));
  }  
  cout << fixed << setprecision(15) << res;
  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...
#Verdict Execution timeMemoryGrader output
Fetching results...