#include <bits/stdc++.h>
using namespace std;
const int maxn = 501;
pair <int, int> a[maxn];
float dp[maxn][maxn][maxn];
int n, k;
float get(int c)
{
for (int i = 1;i <= n;i++)
{
for (int x = max(0, c - n + i);x <= min(i, c);x++)
{
for (int xp = max(0, k - x - n + i);xp <= min(i - x, k - x);xp++)
{
dp[i][x][xp] = dp[i - 1][x][xp];
if (x + xp > i - 1)
{
dp[i][x][xp] = 1e18;
}
if (x)
{
dp[i][x][xp] = min(dp[i][x][xp], dp[i - 1][x - 1][xp] + (float)a[i].first / x);
}
if (xp)
{
dp[i][x][xp] = min(dp[i][x][xp], dp[i - 1][x][xp - 1] + (float)a[i].second / (c + 1));
}
}
}
}
return dp[n][c][k - c];
}
int main()
{
cout << setprecision(20);
cin >> n >> k;
for (int i = 1;i <= n;i++)
{
cin >> a[i].second >> a[i].first;
if (a[i].first == -1)
{
a[i].first = maxn * maxn * maxn;
}
}
sort(a + 1 , a + n + 1);
for (int x = 0;x <= n;x++)
{
for (int i = 0;i <= n;i++)
{
for (int j = 0;j <= n;j++)
{
dp[x][i][j] = 1e18;
}
}
}
dp[0][0][0] = 0;
float ans = get(0);
int l = 0, r = k + 1;
while (r - l > 1)
{
int mid = (l + r) / 2;
float cur = get(mid), pre = get(mid - 1);
ans = min(ans, min(cur, pre));
if (cur > pre)
{
r = mid;
}
else
{
l = mid;
}
}
cout << ans;
}
# | 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... |