洛谷P4322.最佳团体
题目大意
一个 \(n(1\leq n\leq 2500)\) 个节点的森林,每个点 \(i\) 有权值 \(s_{i},p_{i}(0<s_{i},p_{i}\leq 10^4)\) 以及父亲 \(r_{i}\) 。每个节点可以被选择的前提是其父亲已经被选择,从中选出 \(k(1\leq k\leq n)\) 个节点,使得 \(\sum_{j=1}^{k}\frac{p_{j}}{s_{j}}\) 的值最大,求出这个值。
思路
这很显然是一个分数规划问题,我们可以让每个节点 \(i\) 的权值为 \(p_{i}-s_{i}\times mid\) ,然后二分来判断。我们用节点 \(0\) 作为根把所有森林连起来变成一棵树,每次判断时作树形 \(dp\) ,设 \(dp[v,i]\) 为在以 \(v\) 为根的子树中选取了 \(i\) 个点所获得的最大权值,于是在合并子树 \(to\) 的过程中,有:
\]
\]
每次 \(dp\) 时将所有 \(dp[v,0]\) 初始为 \(0\) ,其余为 \(-inf\) 。最后根据 \(dp[0,k]\) 是否 \(\geq0\) 来判断即可,每次 \(check\) 可以 \(O(n^2)\) 完成,因为每两个节点 \(x,y\) 仅会在 \(lca(x,y)\) 处对遍历次数产生 \(1\) 的贡献,复杂度 \(O(n^2logn)\) 。
代码
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
#define all(x) x.begin(),x.end()
//#define int LL
//#define lc p*2+1
//#define rc p*2+2
#define endl '\n'
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#pragma warning(disable : 4996)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
const double eps = 1e-8;
const LL MOD = 1000000007;
const LL mod = 998244353;
const int maxn = 2510;
vector<int>G[maxn];
LL K, N, S[maxn], P[maxn], R[maxn];
double dp[maxn][maxn];
double val[maxn];
LL vsize[maxn];
void add_edge(int from, int to)
{
G[from].push_back(to);
}
void dfs(int v)
{
vsize[v] = 1;
dp[v][0] = 0;
if (!G[v].size())
{
dp[v][1] = val[v];
return;
}
for (int i = 0; i < G[v].size(); i++)
{
int to = G[v][i];
dfs(to);
for (int j = vsize[v] - 1; j >= 0; j--)
{
for (int k = vsize[to]; k >= 0; k--)
dp[v][j + k] = max(dp[v][j + k], dp[v][j] + dp[to][k]);
}
vsize[v] += vsize[to];
}
if (v)
{
for (int i = vsize[v]; i > 0; i--)
dp[v][i] = dp[v][i - 1] + val[v];
}
}
bool check(double x)
{
for (int i = 0; i <= N; i++)
{
for (int j = 1; j <= K; j++)
dp[i][j] = -inf;
}
for (int i = 1; i <= N; i++)
val[i] = P[i] - S[i] * x;
dfs(0);
if (dp[0][K] - 0 > -eps)
return true;
return false;
}
void solve()
{
double lo = 0, hi = inf;
for (int i = 1; i <= 100; i++)
{
double mid = (lo + hi) / 2;
if (check(mid))
lo = mid;
else
hi = mid;
}
cout << setiosflags(ios::fixed) << setprecision(3) << lo << endl;
}
int main()
{
IOS;
cin >> K >> N;
for (int i = 1; i <= N; i++)
{
cin >> S[i] >> P[i] >> R[i];
add_edge(R[i], i);
}
solve();
return 0;
}
洛谷P4322.最佳团体的更多相关文章
- 洛谷$P4322\ [JSOI2016]$最佳团体 二分+$dp$
正解:二分+$dp$ 解题报告: 传送门$QwQ$ 这题长得好套路嗷,,,就一看就看出来是个$01$分数规划+树形$dp$嘛$QwQ$. 考虑现在二分的值为$mid$,若$mid\leq as$,则有 ...
- 洛谷 P1336 最佳课题选择
P1336 最佳课题选择 题目提供者 yeszy 标签 动态规划 福建省历届夏令营 传送门 难度 尚无评定 题目描述 Matrix67要在下个月交给老师n篇论文,论文的内容可以从m个课题中选择.由于课 ...
- 洛谷 P2096 最佳旅游线路
某旅游区的街道成网格状.其中东西向的街道都是旅游街,南北向的街道都是林阴道.由于游客众多,旅游街被规定为单行道,游客在旅游街上只能从西向东走,在林阴道上则既可从南向北走,也可以从北向南走. 阿龙想到这 ...
- [JSOI2016]最佳团体 DFS序/树形DP
题目 洛谷 P4322 [JSOI2016]最佳团体 Description 茜茜的舞蹈团队一共有\(N\)名候选人,这些候选人从\(1\)到\(N\)编号.方便起见,茜茜的编号是\(0\)号.每个候 ...
- Bzoj4753/洛谷P4432 [JSOI2016]最佳团体(0/1分数规划+树形DP)
题面 Bzoj 洛谷 题解 这种求比值最大就是\(0/1\)分数规划的一般模型. 这里用二分法来求解最大比值,接着考虑如何\(check\),这里很明显可以想到用树形背包\(check\),但是时间复 ...
- LUOGU P4322 [JSOI2016]最佳团体(0/1分数规划+树形背包)
传送门 解题思路 一道0/1分数规划+树上背包,两个应该都挺裸的,话说我常数为何如此之大..不吸氧洛谷过不了啊. 代码 #include<iostream> #include<cst ...
- BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包)
BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包) 标签:题解 阅读体验 BZOJ题目链接 洛谷题目链接 具体实现 看到分数和最值,考虑分数规划 我们要求的是一个\(\dfrac{ ...
- 洛谷 P2279 03湖南 消防局的设立
2016-05-30 16:18:17 题目链接: 洛谷 P2279 03湖南 消防局的设立 题目大意: 给定一棵树,选定一个节点的集合,使得所有点都与集合中的点的距离在2以内 解法1: 贪心 首先D ...
- 洛谷P2756飞行员配对方案问题 P2055假期的宿舍【二分图匹配】题解+代码
洛谷 P2756飞行员配对方案问题 P2055假期的宿舍[二分图匹配] 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架 ...
随机推荐
- 负载均衡的比例(权重,ip_hash,轮询)
目录 一:负载均衡的比例 1.轮询 2.权重 3.ip_hash 二:测试轮询 1.测试 2.重启 3.网址测试 三:测试ip_hash 一:负载均衡的比例 1.轮询 # 默认情况下,Nginx负载均 ...
- 3. hive 常用函数
常用日期函数 1.返回当前或指定时间的时间戳 select unix_timestamp();select unix_timestamp("2020-10-28",'yyyy-MM ...
- python 定义函数关键字def 简单介绍
一 在类中定义的def # python中def 是用来干什么的? # 可以定义函数,就是定义一个功能. class People(): def __init__(self): print(&quo ...
- 2022.02.04 Day1
前言 为日后的算法面试做准备,自己也很喜欢算法这个东西,每天3~5道题. 刷题 1.leetcode 209 长度最下的子数组 题目 长度最下的子数组 大致的意思是从数组中找到长度最小的数组,并且数组 ...
- java-swing-事件监听-焦点监听器
感谢大佬:https://blog.csdn.net/weixin_44512194/article/details/93377551 开始不知道焦点是啥,其实就是打字的时候,这个一闪一闪的竖线. 与 ...
- Nodejs基于Express使用html模板
express默认使用jade模板,可以配置让其支持使用ejs或html模板. 安装ejs 在项目根目录安装ejs. npm install ejs 2.引入ejs var ejs = require ...
- play的action链(一个action跳转到另一个action,类似于重定向)
在play中没有Servlet API forward 的等价物.每一个HTTP request只能调用一个action.如果我们需要调用另一个,必须通过重定向,让浏览器访问另一个URL来访问它.这样 ...
- 无脑安装java编程语言开发的集成环境 IDEA 白嫖版本
无脑安装java编程语言开发的集成环境 IDEA 根python很类似:可以借鉴无脑安装--Python 及 安装python集成开发环境pycharm - 隐姓埋名4869 - 博客园 (cnbl ...
- MySQL 数据库的tab 补全功能 (懒人必备)
MySQL 数据库的tab补全功能 跟着步骤走~~ 懒人养成第一步 不仅帮你补全 甚至预判你的预判,就问你可怕不可怕 1.安装相关依赖软件(需要配置yum官方 ...
- JS特殊监听方法
//监听元素变化classList //监听元素变化className //方法一 var tab2Interval = setInterval(function(){ if(!!($('#tab-2 ...