P4322-[JSOI2016]最佳团体【0/1分数规划,树形背包】
正题
题目链接: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分数规划,树形背包】相关推荐
- [Jsoi2016]最佳团体 BZOJ4753 01分数规划+树形背包/dfs序
分析: 化简一下我们可以发现,suma*ans=sumb,那么我们考虑二分ans,之后做树形背包上做剪枝. 时间复杂度证明,By GXZlegend O(nklogans) 附上代码: #includ ...
- P4322 [JSOI2016]最佳团体(分数规划树上背包)
P4322 [JSOI2016]最佳团体(分数规划&树上背包) 分数问题,首先转为二分性判定问题. 每个结点的值变为:vali=ai−mid×bival_i=a_i-mid\times b_i ...
- 【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp
题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了 ...
- [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{ ...
- [学习笔记]0/1分数规划
对于一类:每个元素有两个属性A,B 选择若干个元素,使得$\frac{\sum A_i}{\sum B_i}$取到最值. 这类问题可以采用二分的方法.然后构造出模型用于判定. 推导: 二分mid 如果 ...
- bzoj 4753: [Jsoi2016]最佳团体
Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位 编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY ...
- bzoj 3232 圈地游戏——0/1分数规划(或网络流)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...
- 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) ...
- jzoj3852-单词接龙【0/1分数规划,负环】
正题 题目链接:https://jzoj.net/senior/#main/show/3852 题目大意 nnn个单词串,头尾有两个相同单词就可以连在一起,求一个最长的环使得平均单词长度最长. 解题思 ...
最新文章
- K8S - Kubernetes简介
- 一篇文章让你了解区块链技术的发展阶段
- 安装Python2.7出现configure: error: no acceptable C compiler found in $PATH错误
- 先本地仓库中国添加jar包
- Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)
- 【IM】关于无监督降维的理解
- 收敛标准对卷积核数量最优值的影响
- Linux 精准获取进程pid--转
- php 判断赋值 简写,PHP IF判断简写
- shell 并发脚本
- linux下安装cudnn
- 8 行代码用Python画一个中国地图
- Cookie、LocalStorage 与 SessionStorage的区别
- mos管的rc吸收电路计算_RC阻容吸收计算公式
- FUP AMD300-27便携式拉曼食品安全分析仪 检测微痕量农兽药残留 非法添加
- 英文期刊催稿信模板_sci,催稿信,模板.docx
- Android 软键盘顶起布局相关
- java move函数重新调用_Move Method (搬移函数)
- win7系统盘瘦身四大招:
- mysql不同分数的人数,mysql如何统计每个专业分数段的人数
热门文章
- ksweb如何安装php5.6_Android端的服务器容器 KSWEB PHP+MySQL环境搭建及应用
- java 图片压缩 base64_图片改变像素,宽高,Base64编码处理
- 班尼机器人维修方法_梅州市ABB机器人控制器维修中心
- python中的成员运算符是干嘛的_在Python中使用成员运算符的示例
- mysql 用户概念_传输概念 – db对象的用户/组/权限从mysql到postgresql
- 7-1 矩阵链相乘问题 (20 分)(思路+详解+题目解析) 动态规划做法
- c语言glut打正方形,OpenGL绘制正方形并用键盘移动
- C++实现双栈结构(一个顺序表中使用两个栈)
- [JavaWeb-Servlet]Servlet相关配置
- [C++STL]常用算术生成算法