正题

题目链接:https://www.luogu.com.cn/problem/P4322


题目大意

nnn个点的一棵树,每个节点有一个(si,pi)(s_i,p_i)(si​,pi​),选择一个点必须选择它的父节点,求选择KKK个点使得∑pxi∑sxi\frac{\sum p_{x_i}}{\sum s_{x_i}}∑sxi​​∑pxi​​​最大。


解题思路

我只会做裸题了/kk

直接上0/10/10/1分数规划然后树形背包。

树形背包要优化,有两种优化方法

  • 因为每个节点的容量是111,所以j,kj,kj,k维枚举的时候只需要枚举到sizx,sizysiz_x,siz_ysizx​,sizy​即可,这样时间复杂度是O(n2)O(n^2)O(n2)的,但是适用性并不强,实际上树形背包常用的优化还是第二种。
  • 儿子兄弟表示法,左儿子是它的第一个子节点,右儿子是它的下一个兄弟,那这样就变成了选择左儿子之前必须选择这个点,dpdpdp即可。当然可以换一种理解方法,那就是两个方程frfnx,j=max{frfnx+sizx,j,fi+1,j−vi+wi}f_{rfn_x,j}=max\{f_{rfn_x+siz_x,j},f_{i+1,j-v_i}+w_i\}frfnx​,j​=max{frfnx​+sizx​,j​,fi+1,j−vi​​+wi​}(rfnxrfn_xrfnx​指点xxx的dfsdfsdfs序列)表示是否xxx跳过这个子树。时间复杂度也是O(n2)O(n^2)O(n2)

codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2600;
const double eps=1e-5;
struct node{int to,next;
}a[N];
int n,k,tot,cnt,ls[N],dfn[N],siz[N];
double s[N],p[N],f[N][N];
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(int x){siz[x]=1;dfn[cnt++]=x;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;dfs(y);siz[x]+=siz[y];}return;
}
bool check(double mid){for(int i=n;i>=0;i--){int x=dfn[i];for(int j=0;j<=k;j++)f[i][j]=f[i+siz[x]][j];for(int j=1;j<=k;j++)f[i][j]=max(f[i][j],f[i+1][j-1]+p[x]-s[x]*mid);}return f[0][k]>=0;
}
int main()
{scanf("%d%d",&k,&n);k++;for(int i=1;i<=n;i++){scanf("%lf%lf",&s[i],&p[i]);int x;scanf("%d",&x);addl(x,i);}for(int i=1;i<=k;i++)f[n+1][i]=-1e18;double l=0,r=1e4;dfs(0);while(r-l>eps){double mid=(l+r)/2.0;if(check(mid))l=mid;else r=mid;}printf("%.3lf",(l+r)/2.0);
}

P4322-[JSOI2016]最佳团体【0/1分数规划,树形背包】相关推荐

  1. [Jsoi2016]最佳团体 BZOJ4753 01分数规划+树形背包/dfs序

    分析: 化简一下我们可以发现,suma*ans=sumb,那么我们考虑二分ans,之后做树形背包上做剪枝. 时间复杂度证明,By GXZlegend O(nklogans) 附上代码: #includ ...

  2. P4322 [JSOI2016]最佳团体(分数规划树上背包)

    P4322 [JSOI2016]最佳团体(分数规划&树上背包) 分数问题,首先转为二分性判定问题. 每个结点的值变为:vali=ai−mid×bival_i=a_i-mid\times b_i ...

  3. 【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp

    题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了 ...

  4. [JSOI2016] 最佳团体(0/1分数规划 + 树形dp)

    problem luogu-P4322 solution 假设每个人是否被招募,用 xi={0,1}x_i=\{0,1\}xi​={0,1} 代替,max⁡∑pi∗xi∑si∗xi\max\frac{ ...

  5. [学习笔记]0/1分数规划

    对于一类:每个元素有两个属性A,B 选择若干个元素,使得$\frac{\sum A_i}{\sum B_i}$取到最值. 这类问题可以采用二分的方法.然后构造出模型用于判定. 推导: 二分mid 如果 ...

  6. bzoj 4753: [Jsoi2016]最佳团体

    Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位 编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY ...

  7. bzoj 3232 圈地游戏——0/1分数规划(或网络流)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...

  8. jzoj4017-逃跑【0/1分数规划,线段树,dp】

    正题 题目链接:https://jzoj.net/senior/#contest/show/3011/2 题目大意 n+1n+1n+1个连续的地方,每个地方有(a,b,c)(a,b,c)(a,b,c) ...

  9. jzoj3852-单词接龙【0/1分数规划,负环】

    正题 题目链接:https://jzoj.net/senior/#main/show/3852 题目大意 nnn个单词串,头尾有两个相同单词就可以连在一起,求一个最长的环使得平均单词长度最长. 解题思 ...

最新文章

  1. K8S - Kubernetes简介
  2. 一篇文章让你了解区块链技术的发展阶段
  3. 安装Python2.7出现configure: error: no acceptable C compiler found in $PATH错误
  4. 先本地仓库中国添加jar包
  5. Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)
  6. 【IM】关于无监督降维的理解
  7. 收敛标准对卷积核数量最优值的影响
  8. Linux 精准获取进程pid--转
  9. php 判断赋值 简写,PHP IF判断简写
  10. shell 并发脚本
  11. linux下安装cudnn
  12. 8 行代码用Python画一个中国地图
  13. Cookie、LocalStorage 与 SessionStorage的区别
  14. mos管的rc吸收电路计算_RC阻容吸收计算公式
  15. FUP AMD300-27便携式拉曼食品安全分析仪 检测微痕量农兽药残留 非法添加
  16. 英文期刊催稿信模板_sci,催稿信,模板.docx
  17. Android 软键盘顶起布局相关
  18. java move函数重新调用_Move Method (搬移函数)
  19. win7系统盘瘦身四大招:
  20. mysql不同分数的人数,mysql如何统计每个专业分数段的人数

热门文章

  1. ksweb如何安装php5.6_Android端的服务器容器 KSWEB PHP+MySQL环境搭建及应用
  2. java 图片压缩 base64_图片改变像素,宽高,Base64编码处理
  3. 班尼机器人维修方法_梅州市ABB机器人控制器维修中心
  4. python中的成员运算符是干嘛的_在Python中使用成员运算符的示例
  5. mysql 用户概念_传输概念 – db对象的用户/组/权限从mysql到postgresql
  6. 7-1 矩阵链相乘问题 (20 分)(思路+详解+题目解析) 动态规划做法
  7. c语言glut打正方形,OpenGL绘制正方形并用键盘移动
  8. C++实现双栈结构(一个顺序表中使用两个栈)
  9. [JavaWeb-Servlet]Servlet相关配置
  10. [C++STL]常用算术生成算法