捞,玄关
查看原帖
捞,玄关
700558
williamwei楼主2024/11/28 14:18
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
const int maxn = 2500 + 10;
const int inf = 1e8;
const double eps = 1e-5;
int n, k, tot, a[maxn], b[maxn], id[maxn], sz[maxn];
double f[maxn][maxn];
vector<int> e[maxn];
void dfs(int u) {
    sz[u] = 1;
    for (int v : e[u]) dfs(v), sz[u] += sz[v];
    id[++tot] = u;
}
bool check(double x) {
    for (int u = 0; u <= n; u++)
        for (int i = 1; i <= k; i++) f[u][i] = -inf;
    for (int i = 1; i <= n; i++) f[i][1] = a[id[i]] - x * b[id[i]];
    for (int i = 1; i <= n; i++)
        for (int j = 2; j <= k; j++)
            f[i][j] = max(f[i - 1][j - 1] + f[i][1], f[i - sz[id[i]]][j]);
    return f[n][k] >= 0;
}
int main() {
    ios::sync_with_stdio(false);
    cin >> k >> n;
    for (int i = 1, x; i <= n; i++) cin >> b[i] >> a[i] >> x, e[x].push_back(i);
    dfs(0); double l = 0, r = inf;
    while (r - l > eps) {
        double mid = (l + r) / 2;
        if (check(mid)) l = mid;
        else r = mid;
    }
    cout << fixed << setprecision(3) << l << '\n';
    return 0;
}
2024/11/28 14:18
加载中...