rt,有没有dalao救救我/kk
#include<map>
#include<set>
#include<queue>
#include<deque>
#include<stack>
#include<ctime>
#include<cmath>
#include<cctype>
#include<bitset>
#include<vector>
#include<cstdio>
#include<climits>
#include<cstring>
#include<iostream>
#include<algorithm>
#define eps 1e-4
#define INF 0x3f3f3f3f
#define N 2510
using namespace std;
int n,k,x,tot,cnt,ind[N],Size[N],s[N],p[N],r[N];
double dis[N],f[N][N];
vector<int>G[N];
double max(double x,double y){return x>y?x:y;}
int read(){
int x=0,f=1,ch=getchar();
for(;ch<'0' || ch>'9';ch=getchar()) f=(ch=='-')?-1:1;
for(;ch>='0' && ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
void add_edge(int x,int y){
G[x].push_back(y);
G[y].push_back(x);
}
void init(){
k=read(),n=read();
for(int i=1;i<=n;++i){
s[i]=read(),p[i]=read(),r[i]=read();
add_edge(r[i],i);
add_edge(i,r[i]);
}
}
inline void dfs(int x,int f){
ind[++cnt]=x;
Size[x]=1;
for(int i=0;i<G[x].size();++i){
int y=G[x][i];
if(y==f) continue;
dfs(y,x);
Size[x]+=Size[y];
}
}
bool check(double x){
int nn=n+1,kk=k+1;
for(int i=1;i<=nn+1;++i){
for(int j=1;j<=kk;++j){
f[i][j]=-INF;
}
}
for(int i=1;i<=n;++i) dis[i]=(double)p[i]-x*s[i];
for(int i=nn;i>=1;--i){
for(int j=1;j<=kk;++j){
f[i][j]=max(f[i][j],f[i+1][j-1]+dis[ind[i]]);
f[i][j]=max(f[i][j],f[i+Size[ind[i]]][j-1]+dis[ind[i]]);
f[i][j]=max(f[i][j],f[i+Size[ind[i]]][j]);
}
}
if(f[1][kk]>0) return true;
return false;
}
void solve(){
dfs(0,0);
double l=0.0,r=1e8;
while(r-l>eps){
// printf("l:%.3lf r:%.3lf\n",l,r);
double mid=(l+r)/2;
// printf("%d\n",check(mid));
if(check(mid)) l=mid;
else r=mid;
}
printf("%.3lf",l);
}
int main(){
init();
solve();
return 0;
}