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)相关推荐

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

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

  2. P4322-[JSOI2016]最佳团体【0/1分数规划,树形背包】

    正题 题目链接:https://www.luogu.com.cn/problem/P4322 题目大意 nnn个点的一棵树,每个节点有一个(si,pi)(s_i,p_i)(si​,pi​),选择一个点 ...

  3. P1642 规划 01分数规划+树形DP

    $ \color{#0066ff}{ 题目描述 }$ 某地方有N个工厂,有N-1条路连接它们,且它们两两都可达.每个工厂都有一个产量值和一个污染值.现在工厂要进行规划,拆除其中的M个工厂,使得剩下的工 ...

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

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

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

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

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

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

  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. 五大经常使用算法 之 动态规划法
  2. troubleshoot之:分析OutOfMemoryError异常
  3. 1623: 街道路径条数
  4. C++(15)--面向对象编程实践-欢乐斗地主(vector的花式输出)
  5. java.lang.NumberFormatException: null
  6. 520送你一份WebStorm的主题包,附带使用图文教程
  7. css 旋转 animation动画
  8. PReLU, LReLU, ReLU
  9. RoboWare的安装与使用
  10. 小米笔记本android,小米笔记本同步助手下载
  11. 捡到的苹果手机怎么解id锁_苹果手机软解和硬解的区别
  12. python矩阵运算算法_python 矩阵运算
  13. 建网站还有用吗?现解说您的网站不赚钱,同行在盈利
  14. ospf在NBMA网络中的实验(保姆级别)
  15. 攻防世界萌新misc-wp
  16. wilf tree java_伴读 | 牛津树【2-9】New Trees
  17. 数组的定义、初始化和使用
  18. 基于underlay和overlay转换的四层负载均衡
  19. Tasker短信转发
  20. 输出1900至2000年(包含1900年和2000年)间的所有闰年

热门文章

  1. 拼多多出现大Bug:100无门槛券随便领,一晚损失200亿
  2. 主机挂载存储_备战CKA每日一题——第3天 | 对接CSI存储知识
  3. Android带三角形的弹窗,Android实现三角形气泡效果方式汇总
  4. 程序员吐槽_产品经理吐槽大会,程序员勿入
  5. android主动显示流程,Activity加载显示基本流程
  6. python3.7安装keras教程_Python3.7安装keras和TensorFlow的教程图解
  7. 四川中级职称计算机考试考b级,四川省职称计算机B级考试1卷
  8. 用户登录查全表好还是用用户名好_外贸人/货代人不要为海运难过了:请看如何查运价和调配舱位解决缺箱!...
  9. 软件构造学习笔记-第八周
  10. 黑鲨会升级鸿蒙吗,买华为别乱选!这3款才是“最佳选择”,未来能升级鸿蒙系统...