当前位置: 首页 > news >正文

题解:P16156 [ICPC 2016 NAIPC] Programming Team

看到双倍经验我立马打开了题解通道。

思路

看到这一类某个数除以某个数的题容易联想到分数规划。

我们可以每个点和他的推荐人之间连边(双向),接着以 \(p_i - s_i * mid\) 为点权跑动态规划即可。

\(f_{i, j}\) 表示从 \(i\) 的子树中选 \(j\) 个节点的最大总价值,\(si_i\) 表示当前节点 \(i\) 处理了的节点数。

则转移式为 \(f_{u, i + j} = \max(f_{u, i} + f_{v, j})\)

同时,由于只有当推荐人也属于团队或者是 CEO 时,你才能将候选人分配到团队中,当前的 \(f_{u, i}\) 一定选了 \(u\),所以我们要把 \(f_{u,i}\) 全部向左移一位,同时加上 \(c_i\)(点权)。

代码

#include <bits/stdc++.h>
#define il inline
#define pii pair<int, int>
#define ppp(QWQ, QAQ) pair<QWQ, QAQ>
#define pb emplace_back
#define pf emplace_front
#define mpa make_pair
#define pqs(QWQ) priority_queue<QWQ, vector<QWQ>, greater<QWQ> >
#define pqb(QWQ) priority_queue<QWQ>
#define Rep(i, s, e, t) for(int i = (s); i <= (e); i += (t))
#define REP(i, s, e, t) for(int i = (s); i >= (e); i -= (t))
#define debug(a, b) cout << #a << " = " << a << b;
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) (a) = ((a) < (b) ? (a) : (b))
#define Max(a, b) (a) = ((a) > (b) ? (a) : (b))
#define fi first
#define se second
#define int ll
using namespace std;
using ll = long long;
using ull = unsigned long long;il ll read() { ll a = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); } while('0' <= ch && ch <= '9') { a = a * 10 + ch - '0'; ch = getchar(); } return a * f; }
il void write(ll x) { if(x < 0) putchar('-'), x = -x; if(x > 9) write(x / 10); putchar(x % 10 + '0'); }const int N = 2510;
const double eps = 1e-5, INF = 1e18;
int k, n, si[N], a[N], b[N];
double c[N], f[N][N], g[N];
vector<int> e[N];il void add(int u, int v) { e[u].pb(v); }il void dfs(int u, int fa) {Rep(i, 1, n, 1) f[u][i] = -INF;f[u][0] = si[u] = 0;for(auto &v : e[u]) {if(v == fa) continue;dfs(v, u);fill(g, g + n + 1, -INF);Rep(i, 0, si[u], 1) Rep(j, 0, si[v], 1) Max(g[i + j], f[u][i] + f[v][j]);Rep(i, 0, si[u] + si[v], 1) f[u][i] = g[i];si[u] += si[v];}REP(i, si[u], 0, 1) f[u][i + 1] = f[u][i] + c[u];//强制选择节点 u 本身++si[u];//选了的节点
}il bool check(double x) {Rep(i, 1, n, 1) c[i] = b[i] - a[i] * x;dfs(0, -1);return f[0][k + 1] >= 0;
}signed main() {k = read(), n = read();Rep(i, 1, n, 1) {a[i] = read(), b[i] = read();int u = read();add(u, i), add(i, u);}double l = 0, r = 1e4;while(r - l > eps) {double mid = (l + r) / 2;if(check(mid)) l = mid;else r = mid;}printf("%.3f", l);return (1 ^ 0 ^ 1);
}
http://www.jsqmd.com/news/694349/

相关文章:

  • 机器学习与人工智能入门:核心概念与实战指南
  • 7个实用技巧彻底解决ADK-Python数据库连接兼容性痛点:URI格式校验与工具集成指南
  • 中职院校如何挑选合适的学工管理平台?这几个关键点要把握好
  • 海南最推荐的钟点工公司服务平台中心有哪些?2026年海口等地市场选择前五排名 - 十大品牌榜
  • PRML零样本学习:解锁unseen类别识别的终极指南
  • lvgl_v8之网格布局代码示例
  • 保姆级教程:在Ubuntu 20.04 + ROS Noetic上从源码编译GVINS(含Ceres、Eigen版本避坑指南)
  • 【安卓学习之myt】git常用命令(+矢量图+歌曲宝)
  • 从零到自动化:用Jenkins+Git打造你的第一个CI/CD流水线(实战演练)
  • Qwen3-14B企业级日志管理:推理请求记录+敏感词过滤+审计追踪
  • 拼车行程存证程序,行程,费用,路线上链,发生纠纷可追溯,防止绕路,临时加价。
  • ExplorerPatcher完全卸载指南:告别资源管理器修改工具的正确方式
  • 2026 广州搬家服务质量榜出炉!新华网街头采访百万街坊,这五家凭实力领跑 - 广州搬家老班长
  • 5分钟部署vs3天配置:轻量级PaaS如何碾压Kubernetes?
  • 从零到一:IAR嵌入式工程搭建与高效配置全流程解析
  • 算法寻优之爬山法:从局部最优到全局视野的探索
  • 如何用Electron快速开发跨平台社交API集成工具:从0到1完整指南
  • 《PySide6 GUI开发指南:QML核心与实践》 第九篇:跨平台开发——一次编写,多端运行
  • 海南最推荐的住家阿姨服务平台有哪些?2026年海口等地市场选择前五排名 - 十大品牌榜
  • Blast网站序列比对以及进化树的构建
  • 2025 GitHub Docs性能优化实战:从卡顿到毫秒级响应的蜕变
  • Esptool:揭秘ESP芯片固件编程的3个高级技巧与实战指南
  • 容器迁移 java 应用 OOM 事件
  • 从‘手动挡’到‘自动挡’:PyTorch实现MLP的两种姿势对比(含完整代码与性能分析)
  • WebPlotDigitizer完全指南:3步从图表图像提取精准数据的终极解决方案
  • Qwen3.5-4B-AWQ参数详解:temperature/top_p/max_tokens调优指南
  • 海南最推荐的做饭阿姨公司服务机构有哪些?2026年海口等地市场选择前五排名 - 十大品牌榜
  • 会员积分链上管理程序,积分发行,消耗过期规划上链,平台无法随意清零,篡改规则。
  • 从一道经典C语言题出发:手把手教你封装gcd和lcm函数,提升代码复用性
  • Navicat无限试用终极指南:macOS版14天限制一键破解方案