bzoj4753 最佳团体
题目描述
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]);
- // luogu-judger-enable-o2
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstdlib>
- #include <cstring>
- #include <stack>
- #define in(a) a=read()
- #define MAXN 200020
- #define REP(i,k,n) for(int i=k;i<=n;i++)
- using namespace std;
- inline int read(){
- int x=,f=;
- char ch=getchar();
- for(;!isdigit(ch);ch=getchar())
- if(ch=='-')
- f=-;
- for(;isdigit(ch);ch=getchar())
- x=x*+ch-'';
- return x*f;
- }
- int k,n;
- int INF=;
- double p[],s[];
- int total=,to[],nxt[],head[];
- int cnt=,dfn[],ind[],size[];
- double f[][],val[];
- inline void adl(int a,int b){
- total++;
- to[total]=b;
- nxt[total]=head[a];
- head[a]=total;
- return ;
- }
- inline void DFS(int u){
- dfn[u]=cnt;
- ind[cnt++]=u;
- size[u]=;
- for(int e=head[u];e;e=nxt[e]){
- DFS(to[e]);
- size[u]+=size[to[e]];
- }
- return ;
- }
- inline double DP(double x){
- //cout<<x<<endl;
- REP(i,,n){
- val[i]=p[ind[i]]-x*s[ind[i]];
- //cout<<ind[i]<<" "<<val[i]<<endl;
- }
- REP(i,,n+)
- REP(j,,k+)
- f[i][j]=-INF;
- REP(i,,n)
- REP(j,,min(i,k+)){
- f[i+][j+]=max(f[i+][j+],f[i][j]+val[i]);
- f[i+size[ind[i]]][j]=max(f[i+size[ind[i]]][j],f[i][j]);
- }
- /*REP(i,0,n){
- REP(j,0,min(i,k+1))
- cout<<f[i][j]<<" ";
- cout<<endl;
- }*/
- return f[n+][k+];
- }
- int main(){
- in(k);in(n);
- int a;
- double maxn=-INF;
- REP(i,,n){
- scanf("%lf%lf%d",&s[i],&p[i],&a);
- adl(a,i);
- maxn=max(maxn,p[i]);
- }
- DFS();
- val[]=0.0;
- double left=0.0,right=maxn;
- while(right-left>0.00001){
- double mid=(left+right)/2.0;
- //cout<<left<<" "<<right<<" "<<mid<<endl;
- if(DP(mid)>=0.00001) left=mid;
- else right=mid;
- }
- printf("%.3lf",left);
- return ;
- }
- /*
- 2 4
- 1 2 0
- 2 2 0
- 1 3 1
- 2 3 1
- */
bzoj4753 最佳团体的更多相关文章
- 【BZOJ4753】最佳团体(分数规划,动态规划)
[BZOJ4753]最佳团体(分数规划,动态规划) 题面 BZOJ Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一 ...
- BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包)
BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包) 标签:题解 阅读体验 BZOJ题目链接 洛谷题目链接 具体实现 看到分数和最值,考虑分数规划 我们要求的是一个\(\dfrac{ ...
- loj#2071. 「JSOI2016」最佳团体
题目链接 loj#2071. 「JSOI2016」最佳团体 题解 树形dp强行01分规 代码 #include<cstdio> #include<cstring> #inclu ...
- BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划
BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划 又是一道卡精度卡得我头皮发麻的题-- 题面(--蜜汁改编版) YL大哥是24OI的大哥,有一天,他想要从\(N\)个候选人中选 ...
- BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划
BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划 Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人 ...
- [JSOI 2016] 最佳团体(树形背包+01分数规划)
4753: [Jsoi2016]最佳团体 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2003 Solved: 790[Submit][Statu ...
- [JSOI2016]最佳团体 DFS序/树形DP
题目 洛谷 P4322 [JSOI2016]最佳团体 Description 茜茜的舞蹈团队一共有\(N\)名候选人,这些候选人从\(1\)到\(N\)编号.方便起见,茜茜的编号是\(0\)号.每个候 ...
- BZOJ4753 JSOI2016最佳团体(分数规划+树形dp)
看到比值先二分答案.于是转化成一个非常裸的树形背包.直接暴力背包的话复杂度就是O(n2),因为相当于在lca处枚举每个点对.这里使用一种更通用的dfs序优化树形背包写法.https://www.cnb ...
- 【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp
题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了 ...
随机推荐
- 全文搜索引擎 Elasticsearch 介绍
全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选. 它可以快速地储存.搜索和分析海量数据.维基百科.Stack Overflow.Gi ...
- Django框架<一>
Django框架 Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Sess ...
- Python 库汇总英文版
Awesome Python A curated list of awesome Python frameworks, libraries, software and resources. Insp ...
- java版云笔记(七)之事务管理
事务管理 事务:程序为了保证业务处理的完整性,执行的一条或多条SQL语句. 事务管理:对事务中的SQL语句进行提交或者回滚. 事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的 ...
- Hive入门学习随笔(一)
Hive入门学习随笔(一) ===什么是Hive? 它可以来保存我们的数据,Hive的数据仓库与传统意义上的数据仓库还有区别. Hive跟传统方式是不一样的,Hive是建立在Hadoop HDFS基础 ...
- 初涉yield
function* a(i) { console.log('here we go'); yield i; // 必须有*,不然b会作为返回值,而不是执行 yield* b(i); yield i+10 ...
- 【hdoj_2566】统计硬币(母函数?)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2566 本题可以借鉴母函数(组合数学)的思想. 题目可以这样理解:给一堆硬币,分别有1,2,5元的各无数个, ...
- 洛谷 P1652圆 题解
题目传送门 这道题也就是考你对几何的了解: 圆与圆没有公共点且一个圆在另一个圆外面时,叫做圆与圆相离. 当圆心距大于两圆半径之和时,称为两圆外离: 当圆心距小于两圆半径之差的绝对值时,称为两圆内含. ...
- logstash通过tcp收集日志
(1)标准输入输出tcp模块 1.修改配置文件 #vim /etc/logstash/conf.d/tcp.conf input { tcp { port => "5600" ...
- karma+seajs
下面的介绍以karma能正常运行为前提,看karma系列文章:http://www.cnblogs.com/laixiangran/tag/Karma/ 目录结构 步骤 安装 npm install ...