P3874 砍树 题解
前置
树形 dp,二分。
题意
本质上是一个树上背包,需要选不少于 \(k\) 个物品,每个物品有一个重量 \(w\) 和价值 \(v\),求性价比最大值。
分析
既然是性价比,显然是分数规划。
先介绍一下分数规划是什么:
我们二分这个最大性价比。
假设当前枚举到 \(mid\),则我们将每个点的价值修改为
\]
然后我们正常做树形 dp,然后统计一下是否有价值大于等于 \(0\) 的即可。
那么为什么这样呢?
假设性价比为 \(g\),我们选的是
\]
则我们有
\]
进而可以推出
\]
那么,当我们定义价值 \(val_i=v_i-w_i \times g\) 时,有
\]
成立,故以上算法正确。
实现
比较好说,先二分出来 \(g\),然后跑树形背包即可,注意要一边计算大小 \(size_p\) 一边跑背包,不然复杂度 \(O(n^3)\),加上二分可能 TLE。(虽然我没试过)
然后就是注意把精度卡到 \(0.0001\),不然会 WA。
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
typedef double db;
int ver[N * 2], nxt[N * 2], hd[N], idx;
inline void add (int x, int y) {
ver[++idx] = y;
nxt[idx] = hd[x];
hd[x] = idx;
}
int n, w[N], v[N], k, s[N];
bool mk[N];
db dp[N][N], g[N];
void dfs (int u, int fa) {
dp[u][0] = 0; dp[u][1] = g[u]; s[u] = 1;
for (int i = hd[u]; i ;i = nxt[i]) {
int y = ver[i];
if (y == fa) continue;
dfs(y, u);
s[u] += s[y]; //注意size和dp要一起算
for (int j = min(n, s[u]);j >= 1;j--) { //处理背包
for (int z = 0;z <= min(j - 1, s[y]);z++) {
dp[u][j] = max(dp[u][j], dp[u][j - z] + dp[y][z]);
}
}
}
}
bool check (db x) {
for (int i = 1;i <= n;i++) g[i] = v[i] - x * w[i]; //处理val
for (int i = 1;i <= n;i++) for (int j = 0;j <= n;j++) dp[i][j] = -200000;
dfs(1, 0);
db res = -1;
for (int i = 1;i <= n;i++) for (int j = k;j <= n;j++) {
res = max(res, dp[i][j]);
}
if (res >= 0) return 1;
return 0;
}
int main () {
cin >> n >> k;
for (int i = 1;i <= n;i++) cin >> v[i];
for (int i = 1;i <= n;i++) cin >> w[i];
for (int i = 1;i < n;i++) {
int x, y;
cin >> x >> y;
add(x, y); add(y, x);
}
db l = 0, r = 200000; //二分
while (r - l > 0.0001) { //注意精度
db mid = (l + r) / 2;
if (check(mid)) l = mid;
else r = mid - 0.0001;
}
printf("%.2lf", l);
return 0;
}
P3874 砍树 题解的更多相关文章
- [7.18NOIP模拟测试5]砍树 题解(数论分块)
题面(加密) 又考没学的姿势……不带这么玩的…… 考场上打了个模拟 骗到30分滚粗了 稍加思考(滑稽)可将题面转化为: 求一个最大的$d$,使得 $\sum \limits _{i=1}^n {(\l ...
- 7. 18 test 砍树题解
(题面保密,内部人员可览) 首先观察题面,可得出如下公式 ∑(ceil(a[i] /d)*d−a[i])≤k 其中,ceil(a[i] /d)表示在需要被砍伐之前所经过的轮数,ceil函数是为了保证一 ...
- 7.18 NOIP模拟测试5 星际旅行+砍树+超级树
T1 星际旅行 题意:n个点,m条边,无重边,有自环,要求经过m-2条边两次,2条边一次,问共有多少种本质不同的方案.本质不同:当且仅当至少存在一条边经过次数不同. 题解:考试的时候理解错题,以为他是 ...
- AC日记——砍树 codevs 1388
1388 砍树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 伐木工人米尔科需要砍倒M米长的木 ...
- 1369 xth 砍树
1369 xth 砍树 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 在一个凉爽的夏夜,xth 和 ...
- [CSP-S模拟测试]:砍树(数学+模拟)
题目传送门(内部题1) 输入格式 第一行两个整数$n$,$k$,代表树苗的数量和最大看书的总长度.第二行n个整数$a_i$,代表林先森希望每棵树苗的最终高度. 输出格式 一行一个整数,代表最大可能的d ...
- noip模拟8[星际旅行·砍树·超级树·求和]
也不能算考得好,虽然这次A了一道题,但主要是那道题太简单了,没啥成就感,而且有好多人都A掉了 除了那一道,其他的加起来一共拿了25pts,这我能咋办,无奈的去改题 整场考试的状态并不是很好啊,不知道是 ...
- NOIP模拟测试5「星际旅行·砍树·超级树」
星际旅行 0分 瞬间爆炸. 考试的时候觉得这个题怎么这么难, 打个dp,可以被儿子贡献,可以被父亲贡献,还有自环,叶子节点连边可以贡献,非叶子也可以贡献,自环可以跑一回,自环可以跑两回, 关键是同一子 ...
- codevs 1388 砍树
时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 伐木工人米尔科需要砍倒M米长的木材.这是一个对米尔科来说很容易的工作,因为他有一 ...
- Vijos1448校门外的树 题解
Vijos1448校门外的树 题解 描述: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现 ...
随机推荐
- 2021-12-16:给定两个数a和b, 第1轮,把1选择给a或者b, 第2轮,把2选择给a或者b, ... 第i轮,把i选择给a或者b。 想让a和b的值一样大,请问至少需要多少轮? 来自字节跳动。
2021-12-16:给定两个数a和b, 第1轮,把1选择给a或者b, 第2轮,把2选择给a或者b, - 第i轮,把i选择给a或者b. 想让a和b的值一样大,请问至少需要多少轮? 来自字节跳动. 答案 ...
- 去掉DosBox烦人的Status Windows
首先我们上成品动态图 很干净,很清爽有没有! 步骤 1.找到并选中DosBox快捷方式,鼠标右键点击选择属性 2.修改目标后面的参数,默认是 -userconf ,再添加一个 -noconsole 就 ...
- npm run serve/build 背后的真实操作
vue CLI 用起来的确很舒服,方便省事,但他经过层层封装很难明白,执行完那个npm run serve/build 后他都干了些什么,甚至不知道整个项目是怎么跑起来的,今天自己抽时间就去瞅瞅,为加 ...
- Part2: DDPM as Example of Variational Inference
很多次翻看DDPM,始终不太能理解论文中提到的\(\text{Variational Inference}\)到底是如何在这个工作中起到作用.五一假期在家,无意间又刷到徐亦达老师早些年录制的理论视频, ...
- ODOO13之12:Odoo 13开发之报表和服务端 QWeb
报表是业务应用非常有价值的功能,内置的 QWeb 引擎是报表的默认引擎.使用 QWeb 模板设计的报表可生成 HTML 文件并被转化成 PDF.也就是说我们可以很便捷地利用已学习的 QWeb 知识,应 ...
- Electron-ChatGPT桌面端ChatGPT实例|electron25+vue3聊天AI模板EXE
基于electron25+vite4+vue3仿制chatgpt客户端聊天模板ElectronChatGPT. electron-chatgpt 使用最新桌面端技术Electron25.x结合Vite ...
- 体验了一把 MiniGPT-4,一言难尽
最近看到一个好玩的开源项目:MiniGPT-4. 看名字像 GPT-4 的小老弟,其实没啥关系. 简单说,它可以识别图像,基于图像你可以和它对话,它能生成图片描述.网站.诗歌. 先看看官方给出的例子截 ...
- JAVA SE基础《一》----JAVA入门
初识Java 1.Java背景知识 java是美国sun公司(Stanford University Network)在1995年推出的一门计算机高级编程语言. Java早期称为Oak(橡树),后期改 ...
- 基于Node.js的分布式应用程序架构设计与最佳实践:实现高效、可扩展的分布式系统
目录 基于Node.js的分布式应用程序架构设计与最佳实践:实现高效.可扩展的分布式系统 随着互联网的普及和发展,分布式系统已经成为现代应用程序中不可或缺的一部分.而Node.js作为当前最流行的Ja ...
- ASL单芯片CS5366TypeC转HDMI4K60HZ加HUB多口方案|CS5366带PD拓展方案原理图
CS5366芯片是ASL集睿致远最新推出的2Len带PD的扩展坞方案芯片,CS5366支持4K60HZ. 在分辨率4K下,刷新率60HZ对于30HZ看似提升不多,但是对于应用在游戏主座的客户来说至关重 ...