代码如下,本地和洛谷IDE都是0.002
#include <iostream>
#include <set>
#include <random>
#include <map>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <algorithm>
#define lowbit(o) o & -o
#define pb push_back
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int N = 2505;
const int mod = 998244353;
const int inf = 0x3f3f3f3f;
const LL INF = 2e18;
vector<int> g[N];
int siz[N], f[N][N], s[N], p[N], n, k;
double mid;
void dfs(int u,int fa)
{
siz[u] = 1;
f[u][0] = 0;
f[u][1] = p[u] - s[u] * mid;
for (int i : g[u])
{
if (i == fa)
continue;
dfs(i, u);
siz[u] += siz[i];
for (int j=min(k, siz[u]);j;j--)
for (int v=0;v<=min(j-1,siz[i]);v++)
f[u][j] = max(f[u][j], f[u][j - v] + f[i][v]);
}
}
bool check()
{
memset(f, -0x3f, sizeof f);
dfs(0, 0);
return f[0][k] >= 0;
}
void work()
{
cin>>k>>n;
for (int i=1;i<=n;i++)
{
int fa;
cin>>s[i]>>p[i]>>fa;
g[fa].pb(i);
}
k ++;
const double eps = 1e-6;
double l = 0, r = 1e4;
while (r - l > eps)
{
mid = (l + r) / 2;
if (check())
l = mid;
else
r = mid;
}
printf("%.3lf", l);
}
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int _T = 1;
//cin >> _T;
while (_T--)
work();
return 0;
}
没发现这题有SPJ啊