记录编号 598093 评测结果 AAAAAAAAAA
题目名称 [JSOI 2016]最佳团体 最终得分 100
用户昵称 Gravatar袁书杰 是否通过 通过
代码语言 C++ 运行时间 0.745 s
提交时间 2025-01-05 10:53:59 内存使用 15.32 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
int K,n,R[2505],head[2505*2],size[2505],etot;
double l,r,ans,a[2505],dp[2505][2505],s[2505],p[2505];
struct Edge {
	int u,v,nxt;
} e[2505*2];
void adde(int u,int v) {
	e[++etot]=(Edge) {
		u,v,head[u]
	};
	head[u]=etot;
}
void dfs(int now,int father,double num){
	if(now==0){
		dp[now][1]=0;
	}
	else{
		dp[now][1]=p[now]-num*s[now];
	}
	size[now]=1;
	for(int i=head[now];i;i=e[i].nxt){
		int v=e[i].v;
		if(v==father){
			continue;
		}
		dfs(v,now,num);
		size[now]+=size[v];
		for(int j=min(size[now],K+1);j>=1;j--){
			for(int k=0;k<=min(size[v],j-1);k++){
				dp[now][j]=max(dp[now][j],dp[now][j-k]+dp[v][k]);
			}
		}
	}
}
bool check(double num){
	for(int i=0;i<=n;i++){
		for(int j=1;j<=K+1;j++){
			dp[i][j]=-5e18;
		}
	}
	dfs(0,-1,num);
	return dp[0][K+1]>=0;
}
signed main(){
	freopen("bestteam.in","r",stdin);
	freopen("bestteam.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>K>>n;
	for(int i=1;i<=n;i++){
		cin>>s[i]>>p[i]>>R[i];
		adde(R[i],i);
	}
	r=1e4;
	while(r-l>1e-4){
		double mid=(l+r)/2;
		if(check(mid)){
			l=mid;
			ans=l;
		}
		else{
			r=mid;
		}
	}
	printf("%.3lf",ans);
	return 0;
}