[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{\sum p_i*x_i}{\sum s_i*x_i}max∑si∗xi∑pi∗xi。
0/10/10/1 分数规划标准式子。
二分答案 ans=∑pi∗xi∑si∗xi⇒max∑xi∗(pi−ans∗si)≥0ans=\frac{\sum p_i*x_i}{\sum s_i*x_i}\Rightarrow \max\sum x_i*(p_i-ans*s_i)\ge 0ans=∑si∗xi∑pi∗xi⇒max∑xi∗(pi−ans∗si)≥0。
将 pi−ans∗sip_i-ans*s_ipi−ans∗si 重新定为 iii 候选人的价值 valival_ivali。
树形 dpdpdp 求选 kkk 个人的最大价值。
f(u,i):f(u,i):f(u,i): 在 uuu 为根的子树内选了 iii 个人的最大价值。
树形背包合并即可。f(u,i)=max{f(u,i−j)+f(v,j)}f(u,i)=\max\{f(u,i-j)+f(v,j)\}f(u,i)=max{f(u,i−j)+f(v,j)}。
因为必须 uuu 选了才能选其子树内的其余点,所以 j≤i−1j\le i-1j≤i−1 保证必选 uuu。
最后因为可能有多个候选人是被 JYYJYYJYY 看上的,所以统一他们的根为 000,判断 f(0,k+1)f(0,k+1)f(0,k+1) 即可。
code
#include <bits/stdc++.h>
using namespace std;
#define maxn 2505
int k, n, root;
vector < int > G[maxn];
int siz[maxn];
double s[maxn], p[maxn], val[maxn];
double f[maxn][maxn];void dfs( int u ) {f[u][1] = val[u]; siz[u] = 1;for( int v : G[u] ) {dfs( v );siz[u] += siz[v];for( int i = min( siz[u], k + 1 );i;i -- )for( int j = 0;j <= min( siz[v], i - 1 );j ++ )f[u][i] = max( f[u][i], f[u][i - j] + f[v][j] );}
}double check( double x ) {for( int i = 1;i <= n;i ++ ) val[i] = p[i] - x * s[i];for( int i = 0;i <= n;i ++ )for( int j = 1;j <= k + 1;j ++ )f[i][j] = -1e9;dfs( 0 ); return f[0][k + 1];
}int main() {scanf( "%d %d", &k, &n );for( int i = 1, fa;i <= n;i ++ ) {scanf( "%lf %lf %d", &s[i], &p[i], &fa );G[fa].push_back( i );}double l = 0, r = 1e4, ans = 0;while( r - l > 1e-4 ) {double mid = (l + r) / 2;if( check( mid ) >= 0 ) ans = mid, l = mid;else r = mid;}printf( "%.3f\n", ans );return 0;
}
[JSOI2016] 最佳团体(0/1分数规划 + 树形dp)相关推荐
- [Jsoi2016]最佳团体 BZOJ4753 01分数规划+树形背包/dfs序
分析: 化简一下我们可以发现,suma*ans=sumb,那么我们考虑二分ans,之后做树形背包上做剪枝. 时间复杂度证明,By GXZlegend O(nklogans) 附上代码: #includ ...
- P4322-[JSOI2016]最佳团体【0/1分数规划,树形背包】
正题 题目链接:https://www.luogu.com.cn/problem/P4322 题目大意 nnn个点的一棵树,每个节点有一个(si,pi)(s_i,p_i)(si,pi),选择一个点 ...
- P1642 规划 01分数规划+树形DP
$ \color{#0066ff}{ 题目描述 }$ 某地方有N个工厂,有N-1条路连接它们,且它们两两都可达.每个工厂都有一个产量值和一个污染值.现在工厂要进行规划,拆除其中的M个工厂,使得剩下的工 ...
- 【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp
题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了 ...
- P4322 [JSOI2016]最佳团体(分数规划树上背包)
P4322 [JSOI2016]最佳团体(分数规划&树上背包) 分数问题,首先转为二分性判定问题. 每个结点的值变为:vali=ai−mid×bival_i=a_i-mid\times b_i ...
- [学习笔记]0/1分数规划
对于一类:每个元素有两个属性A,B 选择若干个元素,使得$\frac{\sum A_i}{\sum B_i}$取到最值. 这类问题可以采用二分的方法.然后构造出模型用于判定. 推导: 二分mid 如果 ...
- 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个单词串,头尾有两个相同单词就可以连在一起,求一个最长的环使得平均单词长度最长. 解题思 ...
最新文章
- 五大经常使用算法 之 动态规划法
- troubleshoot之:分析OutOfMemoryError异常
- 1623: 街道路径条数
- C++(15)--面向对象编程实践-欢乐斗地主(vector的花式输出)
- java.lang.NumberFormatException: null
- 520送你一份WebStorm的主题包,附带使用图文教程
- css 旋转 animation动画
- PReLU, LReLU, ReLU
- RoboWare的安装与使用
- 小米笔记本android,小米笔记本同步助手下载
- 捡到的苹果手机怎么解id锁_苹果手机软解和硬解的区别
- python矩阵运算算法_python 矩阵运算
- 建网站还有用吗?现解说您的网站不赚钱,同行在盈利
- ospf在NBMA网络中的实验(保姆级别)
- 攻防世界萌新misc-wp
- wilf tree java_伴读 | 牛津树【2-9】New Trees
- 数组的定义、初始化和使用
- 基于underlay和overlay转换的四层负载均衡
- Tasker短信转发
- 输出1900至2000年(包含1900年和2000年)间的所有闰年
热门文章
- 拼多多出现大Bug:100无门槛券随便领,一晚损失200亿
- 主机挂载存储_备战CKA每日一题——第3天 | 对接CSI存储知识
- Android带三角形的弹窗,Android实现三角形气泡效果方式汇总
- 程序员吐槽_产品经理吐槽大会,程序员勿入
- android主动显示流程,Activity加载显示基本流程
- python3.7安装keras教程_Python3.7安装keras和TensorFlow的教程图解
- 四川中级职称计算机考试考b级,四川省职称计算机B级考试1卷
- 用户登录查全表好还是用用户名好_外贸人/货代人不要为海运难过了:请看如何查运价和调配舱位解决缺箱!...
- 软件构造学习笔记-第八周
- 黑鲨会升级鸿蒙吗,买华为别乱选!这3款才是“最佳选择”,未来能升级鸿蒙系统...