社区讨论
分规&树背&链式前向星存图,但是样例段错误,求调
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 条回复,欢迎继续交流。
正在加载回复...