社区讨论

分规&树背&链式前向星存图,但是样例段错误,求调

P4322[JSOI2016] 最佳团体参与者 2已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mjph3ugu
此快照首次捕获于
2025/12/28 16:34
2 个月前
此快照最后确认于
2025/12/31 23:55
2 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define N=2505;
int k,n,fa[N],cnt;
double s[N], p[N], num[N], f[N][N],hd[N],nxt[5005],e[5005],sz[N];
void add(int u,int v) {
	e[cnt]=v,nxt[cnt]=hd[u],hd[u]=cnt++;
}
void dfs(int u,int fa) {
	sz[u]=1;
	f[u][1]=num[u];
	for (int i=hd[u];i!=-1;i=nxt[i]) {
		int v=e[i];
		if(v==fa)continue;
		dfs(v,u);
		for (int a=sz[u]; a>=1; --a) {
			for (int b=sz[v]; b>=1; --b) {
				f[u][a+b]=max(f[u][a+b],f[u][a]+f[v][b]);
			}
		}
		sz[u]+=sz[v];
	}
}
bool check(double mid) {
	for (int i=0; i<=n; ++i){
		num[i]=p[i]-mid*s[i],sz[i]=0;
		for (int j=1;j<=k+1;++j)
			f[i][j]=-1e18;
	}
	dfs(0,-1);
	return f[0][k+1]>0;
}
int main() {
	memset(hd,-1,sizeof hd); 
	cin>>k>>n;
	for (int i = 1; i <= n; ++i) {
		cin>>s[i]>>p[i]>>fa[i];
		add(fa[i],i);
	}
	double l=0,r=1000,mid;
	while (r-l>1e-5) {
		mid= l+(r-l)/2;
		if (check(mid)) l=mid;
		else r=mid;
	}
	cout<<fixed<<setprecision(3)<<l;
	return 0;
}
蒟蒻刚学树上背包 DP,洛谷 IDE 段错误,求助 AI 毫无效果,只能寄希望于万能的洛谷了。
希望能在原代码基础上修改,万分感谢!

回复

6 条回复,欢迎继续交流。

正在加载回复...