#include <iostream>
#include <vector>
#include <algorithm>
#include <limits>
#include <cmath>
using namespace std;
int n, k;
vector<int> start, endt;
vector<vector<int>> sm;
double dp(int i, int col, int mxCol, vector<vector<double>>& memo) {
    if (col == mxCol) {
        if (k - i < 0 || k - i > n) return numeric_limits<double>::infinity();
        return static_cast<double>(sm[i][k - i]) / (mxCol + 1);
    }
    if (i == n) return numeric_limits<double>::infinity();
    if (memo[i][col] != -1) return memo[i][col];
    double x = dp(i + 1, col + 1, mxCol, memo) + (static_cast<double>(endt[i]) / (col + 1));
    double y = dp(i + 1, col, mxCol, memo) + (static_cast<double>(start[i]) / (mxCol + 1));
    memo[i][col] = min(x, y);
    return memo[i][col];
}
double f(int col) {
    vector<vector<double>> memo(n + 1);
    for (int i = 0; i <= n; i++) { memo[i] = vector<double>(i+1, -1); }
    return dp(0, 0, col, memo);
}
int main() {
    cin >> n >> k;
    start.resize(n);
    endt.resize(n);
    vector<pair<int, int>> pairs(n);
    for (int i = 0; i < n; ++i) {
        int a, b;
        cin >> a >> b;
        if (b == -1) b = numeric_limits<int>::max();
        pairs[i] = {a, b};
    }
    sort(pairs.begin(), pairs.end(), [](const pair<int, int>& p1, const pair<int, int>& p2) {
        if (p1.second != p2.second) return p1.second < p2.second;
        return p1.first > p2.first;
    });
    for (int i = 0; i < n; ++i) {
        start[i] = pairs[i].first;
        endt[i] = pairs[i].second;
    }
    sm.assign(n + 1, vector<int>(n + 1, 0));
    for (int i = n - 1; i >= 0; --i) {
        for (int c = 1; c <= n; ++c) {
            if ((n - i) < c) {
                sm[i][c] = numeric_limits<int>::max();
                continue;
            }
            if (i == n - 1) {
                sm[i][c] = start[i];
            } else {
                if (sm[i + 1][c - 1] == numeric_limits<int>::max())
                    sm[i][c] = sm[i + 1][c];
                else
                    sm[i][c] = min(sm[i + 1][c - 1] + start[i], sm[i + 1][c]);
            }
        }
    }
    double res = numeric_limits<double>::infinity();
    int l = 0, r = n;
    for (int mxCol = 0; mxCol <= n; ++mxCol) {
        res = min(res, f(mxCol));
    }
    cout << fixed << res << endl;
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |