检测到 KaTeX 加载失败,可能会导致文中的数学公式无法正常渲染。
#题面
#题目描述
JSOI 信息学代表队一共有 名候选人,这些候选人从 到 编号。方便起见,JYY 的编号是 号。每个候选人都由一位编号比他小的候选人 推荐。如果 ,则说明这个候选人是 JYY 自己看上的。
为了保证团队的和谐,JYY 需要保证,如果招募了候选人 ,那么候选人 也一定需要在团队中。当然了,JYY 自己总是在团队里的。每一个候选人都有一个战斗值 ,也有一个招募费用 。JYY 希望招募 个候选人(JYY 自己不算),组成一个性价比最高的团队。也就是,这 个被 JYY 选择的候选人的总战斗值与总招募费用的比值最大。
#输入格式
输入一行包含两个正整数 和 。
接下来 行,其中第 行包含三个整数 ,表示候选人 的招募费用,战斗值和推荐人编号。
#输出格式
输出一行一个实数,表示最佳比值。答案保留三位小数。
#输入输出样例
样例输入 #1
1 2
1000 1 0
1 1000 1
样例输出 #1
0.001
#数据范围与提示
对于 的数据满足 ,,。
#思路
分数规划 + 树形 DP。
二分之后问题就可以转化成以下形式了:
给定一棵根为 的树。每个点点权为 ,选择一个点就必须选上它的所有祖先节点。求能否取 个节点使得取出的点的点权之和大于零。
设 表示以 为根的子树选择 个节点时的点权和的最大值,有两种情况:
- 不选 。此时这棵子树内的点一个也不能选取,。
- 选 。枚举 的每个子树。对于每个以 为根的子树,枚举在 内选取节点的总个数 以及在子树 内选取的个数 ,有 。
由于情况 的存在, 的值不能为 ,即不能选了 的子树中的节点而不选 本身。
void dfs(int)
中:C++30 |
|
#代码
1 |
|