【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp
题目描述
输入
输出
样例输入
1 2
1000 1 0
1 1000 1
样例输出
0.001
题解
分数规划+树形背包dp
二分答案mid,题目便转化为求是否存在满足题目条件的集合V,使得$\frac{\sum\limits_{i\in V}p_i}{\sum\limits_{i\in V}s_i}\ge mid$,即$\sum\limits_{i\in V}(s_i-mid·p_i)\ge 0$。
这就转化为了一个树形dp问题。
令a[i]=s[i]-mid*p[i],表示i的性价比。设f[i][j]表示从子树i中选出j个且选i,可以获得的最大性价比之和,显然f[i][1]=a[i]。
那么对于每个i的子节点son,相当于有体积为1~si[son]共si[son]个物品放入背包内,每个物品可以放或不放。这相当于01背包问题。
但是这样dp的时间复杂度好像是$O(n^3)$的。
事实上,这里面的有效状态是很少的,如果只枚举有效状态,dp的时间复杂度将到达可以接受的$O(n^2)$。
具体粗略证明:
更新一棵子树的时间复杂度=更新该节点的子节点的时间复杂度+计算该节点的时间复杂度。
计算该节点的复杂度,如果采用最优策略,使用严格的有效区间范围来进行dp,时间复杂度应该为
$O(\sum\limits_{i=1}^m(1+\sum\limits_{j=1}^{i-1}si_j)·si_i)=O(\sum\limits_{i=1}^m\sum\limits_{j=1}^{i-1}si_j·si_i+\sum\limits_{i=1}^msi_i)=O((\sum\limits_{i=1}^msi_i)^2-\sum\limits_{i=1}^msi_i^2+\sum\limits_{i=1}^msi_i)=O(si_x^2-\sum\limits_{i=1}^msi_i^2+si_x)$,
其中$si_i(i\in[1,m])$表示x的第i个儿子节点的子树大小(总共有m个儿子节点),$si_x$表示x的子树大小。
而叶子节点的时间复杂度是$O(1)$的,进而我们可以使用累加法计算出总体dp的时间复杂度为$O(si_{root}^2+\sum\limits_{i=1}^nsi_i^2)=O(n^2)$。
因此总的时间复杂度是$O(n^2\log m)$。
为了避免精度误差带来的答案错误,建议固定二分c次,c值视情况而定,本题中取30可过。
另外由于数据太水了,所以$O(n^3\log m)$的做法也是可以通过本题的。(其实可以自己做一个链的数据卡掉它)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 2510
using namespace std;
int head[N] , to[N] , next[N] , cnt , si[N] , w[N] , v[N] , n;
double a[N] , mid , f[N][N];
void add(int x , int y)
{to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt;
}
void init(int x)
{int i;si[x] = 1;for(i = head[x] ; i ; i = next[i]) init(to[i]) , si[x] += si[to[i]];
}
void dfs(int x)
{int i , j , k , tot = 0 , b = 0;memset(f[x] , 0xc2 , sizeof(f[x]));if(x) f[x][1] = a[x] , tot ++ , b ++ ;else f[x][0] = 0;for(i = head[x] ; i ; i = next[i]){dfs(to[i]);for(j = tot ; j >= b ; j -- )for(k = 1 ; k <= si[to[i]] ; k ++ )f[x][j + k] = max(f[x][j + k] , f[x][j] + f[to[i]][k]);tot += si[to[i]];}
}
int main()
{int n , k , i , x , c = 30;double l = 0 , r = 0;scanf("%d%d" , &k , &n);for(i = 1 ; i <= n ; i ++ ) scanf("%d%d%d" , &w[i] , &v[i] , &x) , add(x , i) , r = max(r , (double)v[i]);init(0);while(c -- ){mid = (l + r) / 2;for(i = 1 ; i <= n ; i ++ ) a[i] = v[i] - mid * w[i];dfs(0);if(f[0][k] >= 0) l = mid;else r = mid;}printf("%.3lf\n" , (l + r) / 2);return 0;
}
转载于:https://www.cnblogs.com/GXZlegend/p/7040678.html
【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp相关推荐
- P4322 [JSOI2016]最佳团体(分数规划树上背包)
P4322 [JSOI2016]最佳团体(分数规划&树上背包) 分数问题,首先转为二分性判定问题. 每个结点的值变为:vali=ai−mid×bival_i=a_i-mid\times b_i ...
- [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),选择一个点 ...
- Talent Show 分数规划加背包dp(还不太懂)
6349: Talent Show 时间限制: 1 Sec 内存限制: 128 MB 提交: 170 解决: 63 [提交] [状态] [讨论版] [命题人:admin] 题目描述 Farmer ...
- bzoj 4753: [Jsoi2016]最佳团体
Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位 编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY ...
- 【bzoj4007】[JLOI2015]战争调度 暴力+树形背包dp
题目描述 给你一棵 $n$ 层的完全二叉树,每个节点可以染黑白两种颜色.对于每个叶子节点及其某个祖先节点,如果它们均为黑色则有一个贡献值,如果均为白色则有另一个贡献值.要求黑色的叶子节点数目不超过 $ ...
- 【bzoj5072】[Lydsy十月月赛]小A的树 树形背包dp
题目描述 给出一棵n个点的树,每个点有黑白两种颜色.q次询问,每次询问给出x和y,问能否选出一个x个点的联通子图,使得其中黑点数目为y. 输入 第一行一个正整数 T 表示数据组数. 对于每一组数据,第 ...
- HDU-4044 树形背包dp好题
不会做,题解是参考网上的.感觉这道题是到好题,使得我对树形背包dp更了解了. 有几个注意的点,直接给出代码,题解以及注意点都在注释里了. #include<bits/stdc++.h> u ...
- [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{ ...
最新文章
- 上班第一天公司就倒闭了??? | 每日趣闻
- 通用权限管理系统组件 给信息管理系统加一个初始化的功能,调用存储过程
- CentOS7安装ipython
- 201128阶段二MVC框架模式、FFmpeg
- candence 16.6 win8.1 x64 破解
- 【ClickHouse】ClickHouse 同步 MySQL 数据库
- 从头构建自己的Linux系统 -转
- QEMU中音频模拟工作过程(十)
- 编译出错:self-encoder.context-me_method = ME_UMH;
- Proteus8.6SP2仿真使用汇总
- 直播特效的实现原理与难点
- SpringBoot整合RedisTemplate实现缓存信息监控
- Charles+Chrome+https,提示隐私设置错误,您的连接不是私密连接
- CART分类与回归树
- 安排,谷粒商城java分布式开发基础篇高级篇与高可用集群架构篇2020
- 汽车4G车载智能终端
- 江南电子计算机研究所,我的中国“芯” | 江南计算所SW1600:国产超算“神威蓝光”的“心脏”-控制器/处理器-与非网...
- 【python pypinyin】汉语拼音字典切换方法
- 上班族的英语学习计划
- Nanopi r4s 基于镜像裁剪的镜像备份方案