题目描述

JSOI 信息学代表队一共有 NN 名候选人,这些候选人从 11 到 NN 编号。方便起见,JYY 的编号是 00 号。每个候选人都由一位编号比他小的候选人R_iRi​ 推荐。如果 R_i = 0Ri​=0​,则说明这个候选人是 JYY 自己看上的。

为了保证团队的和谐,JYY 需要保证,如果招募了候选人 ii,那么候选人 R_iRi​ 也一定需要在团队中。当然了,JYY 自己总是在团队里的。每一个候选人都有一个战斗值 P_iPi​ ,也有一个招募费用 S_iSi​ 。JYY 希望招募 KK 个候选人(JYY 自己不算),组成一个性价比最高的团队。也就是,这 KK 个被 JYY 选择的候选人的总战斗值与总招募费用的比值最大。

输入输出格式

输入格式:

输入一行包含两个正整数 KK 和 NN 。

接下来 NN 行,其中第 ii 行包含三个整数 S_iSi​ , P_iPi​ , R_iRi​ , 表示候选人 ii 的招募费用,战斗值和推荐人编号。

输出格式:

输出一行一个实数,表示最佳比值。答案保留三位小数。

这题涉及到了比值最大,最好用分数规划来解决。

我们需要求出pi和ri的比值最大,不妨设Σpi/Σri>=x  ,经过转移Σpi>=Σri*x => Σpi-Σri*x>=0. 由此可见,我们可以二分出来一个x使这个值>=0.

然后我们可以用树形DP来计算出最优值。

我们先DFS一遍得到每个树上节点的DFS序(时间戳),令f[i][j]为DFS序为i的点,取j个的最优值。

如果当前点取,说明自己的子树也可以取,所以f[i+1][j+1]=max(f[i+1][j+1],f[i][j]+val[i]);

如果当前点不取,说明要取到下一颗树,我们记录size[i]代表以i为根的子树的大小。根据DFS序的性质,我们知道下一颗和自己平行的子树的DFS序为i+size.

所以转移方程是:f[i+size[i]][j]=max(f[i+size[i]][j],f[i][j]);

  1. // luogu-judger-enable-o2
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <cstdlib>
  6. #include <cstring>
  7. #include <stack>
  8. #define in(a) a=read()
  9. #define MAXN 200020
  10. #define REP(i,k,n) for(int i=k;i<=n;i++)
  11. using namespace std;
  12. inline int read(){
  13. int x=,f=;
  14. char ch=getchar();
  15. for(;!isdigit(ch);ch=getchar())
  16. if(ch=='-')
  17. f=-;
  18. for(;isdigit(ch);ch=getchar())
  19. x=x*+ch-'';
  20. return x*f;
  21. }
  22. int k,n;
  23. int INF=;
  24. double p[],s[];
  25. int total=,to[],nxt[],head[];
  26. int cnt=,dfn[],ind[],size[];
  27. double f[][],val[];
  28. inline void adl(int a,int b){
  29. total++;
  30. to[total]=b;
  31. nxt[total]=head[a];
  32. head[a]=total;
  33. return ;
  34. }
  35. inline void DFS(int u){
  36. dfn[u]=cnt;
  37. ind[cnt++]=u;
  38. size[u]=;
  39. for(int e=head[u];e;e=nxt[e]){
  40. DFS(to[e]);
  41. size[u]+=size[to[e]];
  42. }
  43. return ;
  44. }
  45. inline double DP(double x){
  46. //cout<<x<<endl;
  47. REP(i,,n){
  48. val[i]=p[ind[i]]-x*s[ind[i]];
  49. //cout<<ind[i]<<" "<<val[i]<<endl;
  50. }
  51. REP(i,,n+)
  52. REP(j,,k+)
  53. f[i][j]=-INF;
  54. REP(i,,n)
  55. REP(j,,min(i,k+)){
  56. f[i+][j+]=max(f[i+][j+],f[i][j]+val[i]);
  57. f[i+size[ind[i]]][j]=max(f[i+size[ind[i]]][j],f[i][j]);
  58. }
  59. /*REP(i,0,n){
  60. REP(j,0,min(i,k+1))
  61. cout<<f[i][j]<<" ";
  62. cout<<endl;
  63. }*/
  64. return f[n+][k+];
  65. }
  66. int main(){
  67. in(k);in(n);
  68. int a;
  69. double maxn=-INF;
  70. REP(i,,n){
  71. scanf("%lf%lf%d",&s[i],&p[i],&a);
  72. adl(a,i);
  73. maxn=max(maxn,p[i]);
  74. }
  75. DFS();
  76. val[]=0.0;
  77. double left=0.0,right=maxn;
  78. while(right-left>0.00001){
  79. double mid=(left+right)/2.0;
  80. //cout<<left<<" "<<right<<" "<<mid<<endl;
  81. if(DP(mid)>=0.00001) left=mid;
  82. else right=mid;
  83. }
  84. printf("%.3lf",left);
  85. return ;
  86. }
  87. /*
  88. 2 4
  89. 1 2 0
  90. 2 2 0
  91. 1 3 1
  92. 2 3 1
  93. */

 

bzoj4753 最佳团体的更多相关文章

  1. 【BZOJ4753】最佳团体(分数规划,动态规划)

    [BZOJ4753]最佳团体(分数规划,动态规划) 题面 BZOJ Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一 ...

  2. BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包)

    BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包) 标签:题解 阅读体验 BZOJ题目链接 洛谷题目链接 具体实现 看到分数和最值,考虑分数规划 我们要求的是一个\(\dfrac{ ...

  3. loj#2071. 「JSOI2016」最佳团体

    题目链接 loj#2071. 「JSOI2016」最佳团体 题解 树形dp强行01分规 代码 #include<cstdio> #include<cstring> #inclu ...

  4. BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划

    BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划 又是一道卡精度卡得我头皮发麻的题-- 题面(--蜜汁改编版) YL大哥是24OI的大哥,有一天,他想要从\(N\)个候选人中选 ...

  5. BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划

    BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划 Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人 ...

  6. [JSOI 2016] 最佳团体(树形背包+01分数规划)

    4753: [Jsoi2016]最佳团体 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2003  Solved: 790[Submit][Statu ...

  7. [JSOI2016]最佳团体 DFS序/树形DP

    题目 洛谷 P4322 [JSOI2016]最佳团体 Description 茜茜的舞蹈团队一共有\(N\)名候选人,这些候选人从\(1\)到\(N\)编号.方便起见,茜茜的编号是\(0\)号.每个候 ...

  8. BZOJ4753 JSOI2016最佳团体(分数规划+树形dp)

    看到比值先二分答案.于是转化成一个非常裸的树形背包.直接暴力背包的话复杂度就是O(n2),因为相当于在lca处枚举每个点对.这里使用一种更通用的dfs序优化树形背包写法.https://www.cnb ...

  9. 【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp

    题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了 ...

随机推荐

  1. 全文搜索引擎 Elasticsearch 介绍

    全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选. 它可以快速地储存.搜索和分析海量数据.维基百科.Stack Overflow.Gi ...

  2. Django框架<一>

    Django框架 Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Sess ...

  3. Python 库汇总英文版

    Awesome Python  A curated list of awesome Python frameworks, libraries, software and resources. Insp ...

  4. java版云笔记(七)之事务管理

    事务管理 事务:程序为了保证业务处理的完整性,执行的一条或多条SQL语句. 事务管理:对事务中的SQL语句进行提交或者回滚. 事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的 ...

  5. Hive入门学习随笔(一)

    Hive入门学习随笔(一) ===什么是Hive? 它可以来保存我们的数据,Hive的数据仓库与传统意义上的数据仓库还有区别. Hive跟传统方式是不一样的,Hive是建立在Hadoop HDFS基础 ...

  6. 初涉yield

    function* a(i) { console.log('here we go'); yield i; // 必须有*,不然b会作为返回值,而不是执行 yield* b(i); yield i+10 ...

  7. 【hdoj_2566】统计硬币(母函数?)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2566 本题可以借鉴母函数(组合数学)的思想. 题目可以这样理解:给一堆硬币,分别有1,2,5元的各无数个, ...

  8. 洛谷 P1652圆 题解

    题目传送门 这道题也就是考你对几何的了解: 圆与圆没有公共点且一个圆在另一个圆外面时,叫做圆与圆相离. 当圆心距大于两圆半径之和时,称为两圆外离: 当圆心距小于两圆半径之差的绝对值时,称为两圆内含. ...

  9. logstash通过tcp收集日志

    (1)标准输入输出tcp模块 1.修改配置文件 #vim /etc/logstash/conf.d/tcp.conf input { tcp { port => "5600" ...

  10. karma+seajs

    下面的介绍以karma能正常运行为前提,看karma系列文章:http://www.cnblogs.com/laixiangran/tag/Karma/ 目录结构 步骤 安装 npm install ...