bzoj 4753 最佳团体
Written with StackEdit.
Description
\(JSOI\)信息学代表队一共有N名候选人,这些候选人从\(1\)到\(N\)编号。方便起见,\(JYY\)的编号是\(0\)号。每个候选人都由一位编号比他小的候选人\(R_i\)推荐。如果\(R_i=0\)则说明这个候选人是\(JYY\)自己看上的。为了保证团队的和谐,\(JYY\)需要保证,如果招募了候选人\(i\),那么候选人\(R_i\)"也一定需要在团队中。当然了,\(JYY\)自己总是在团队里的。每一个候选人都有一个战斗值P\(_i\)",也有一个招募费用\(S_i\)"。\(JYY\)希望招募\(K\)个候选人(\(JYY\)自己不算),组成一个性价比最高的团队。也就是,这\(K\)个被\(JYY\)选择的候选人的总战斗值与总招募总费用的比值最大。
Input
输入一行包含两个正整数\(K\)和\(N\)。
接下来\(N\)行,其中第\(i\)行包含\(3\)个整数\(S_i,P_i,R_i\)表示候选人i的招募费用,战斗值和推荐人编号。
对于\(100\%\)的数据满足\(1≤K≤N≤2500,0<S_i,P_i≤10^4,0≤R_i<i.\)
Output
输出一行一个实数,表示最佳比值。答案保留三位小数。
Sample Input
1 2
1000 1 0
1 1000 1
Sample Output
0.001
Solution
- \(0/1\)分数规划与树形背包的结合.
- 目标是最大化\(\sum a_i/\sum b_i\).
- 考虑二分答案\(x\),若该答案合法,则\(\sum a_i/\sum b_i\geq x\).
- 移项,有\(\sum a_i-x\cdot \sum b_i\geq 0\).
- 令每个物品的权值为\(a_i-x\cdot b_i\),则转化为一般的最大化总权值的树形背包.得出最大总权值后,若其非负,则说明\(x\)合法,否则不合法.
#include<bits/stdc++.h>
#define inf 1e9
using namespace std;
typedef long long LoveLive;
const double eps=1e-5;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
{
fh=-1;
jp=getchar();
}
while (jp>='0'&&jp<='9')
{
out=out*10+jp-'0';
jp=getchar();
}
return out*fh;
}
const int MAXN=2510;
int a[MAXN],b[MAXN],Fa[MAXN];//p,s,r
int cnt=0,head[MAXN],to[MAXN<<1],nx[MAXN<<1];
double w[MAXN],f[MAXN][MAXN];
int sons[MAXN],siz[MAXN];
inline void add(int u,int v)
{
++cnt;
to[cnt]=v;
nx[cnt]=head[u];
head[u]=cnt;
}
int n,k;
void dfs(int u)
{
siz[u]=1;
f[u][0]=0;
if(sons[u]==0)
{
f[u][1]=w[u];
return;
}
for(int i=head[u];i;i=nx[i])
{
int v=to[i];
dfs(v);
int lim=min(k,siz[u]);
for(int j=lim;j>=0;--j)
{
for(int p=0;p<=siz[v];++p)
{
if(j+p>k)
break;
f[u][j+p]=max(f[u][j+p],f[u][j]+f[v][p]);
}
}
siz[u]+=siz[v];
}
for(int i=k;i>=0;--i)
{
if(i>=1)
f[u][i]=f[u][i-1]+w[u];
else
f[u][i]=0;
}
}
int check(double x)
{
for(int i=1;i<=n;++i)
w[i]=1.0*a[i]-1.0*b[i]*x;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
f[i][j]=-inf;
dfs(1);
if(f[1][k]>-eps)
return 1;
return 0;
}
int main()
{
k=read(),n=read();
++n,++k;
for(int i=2;i<=n;++i)
{
b[i]=read();
a[i]=read();
Fa[i]=read();
++Fa[i];
++sons[Fa[i]];
add(Fa[i],i);
}
double L=0,R=1e4,ans=0;
while(R-L>eps)
{
double mid=(L+R)/2;
if(check(mid))
{
ans=mid;
L=mid;
}
else
R=mid;
}
printf("%.3f\n",ans);
return 0;
}
bzoj 4753 最佳团体的更多相关文章
- bzoj 4753 最佳团体 —— 01分数规划+树形背包
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4753 注意赋初值为 -inf: eps 设为 1e-3 会 WA ... 代码如下: #in ...
- BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划
BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划 又是一道卡精度卡得我头皮发麻的题-- 题面(--蜜汁改编版) YL大哥是24OI的大哥,有一天,他想要从\(N\)个候选人中选 ...
- 【BZOJ4753】最佳团体(分数规划,动态规划)
[BZOJ4753]最佳团体(分数规划,动态规划) 题面 BZOJ 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 ...
- BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包)
BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包) 标签:题解 阅读体验 BZOJ题目链接 洛谷题目链接 具体实现 看到分数和最值,考虑分数规划 我们要求的是一个\(\dfrac{ ...
- loj#2071. 「JSOI2016」最佳团体
题目链接 loj#2071. 「JSOI2016」最佳团体 题解 树形dp强行01分规 代码 #include<cstdio> #include<cstring> #inclu ...
- BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划
BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划 Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人 ...
- [JSOI2016]最佳团体 DFS序/树形DP
题目 洛谷 P4322 [JSOI2016]最佳团体 Description 茜茜的舞蹈团队一共有\(N\)名候选人,这些候选人从\(1\)到\(N\)编号.方便起见,茜茜的编号是\(0\)号.每个候 ...
- bzoj 4753 [Jsoi2016]最佳团体——0/1分数规划
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4753 0/1分数规划裸题. #include<iostream> #includ ...
随机推荐
- $微信小程序开发实践点滴——Bmob基本REST API的python封装
Refer:Bmob后端云REST API接口文档:http://docs.bmob.cn/data/Restful/a_faststart/doc/index.html 本文使用python对Bmo ...
- hadoop08---读写锁
ReentrantLock 直接使用lock接口的话,我们需要实现很多方法,不太方便,ReentrantLock是唯一实现了Lock接口的类,并且ReentrantLock提供了更多的方法,Reen ...
- 【Head First Servlets and JSP】笔记1
1.把Java放到HTML中,JSP应运而生. 2.Servlet本身并没有main()方法,所以必须要有其他Java程序去调用它,这个Java程序就是Web容器(Container).Tomcat就 ...
- 利用C#查看特定服务是否安装
需求:想通过C#代码来查看IIS服务或者MSMQ是否已经安装 分析:IIS服务和MSMQ安装完成后都会创建windows服务,所以我们只需要查看对应的服务是否存在即可. 准备工作: IIS服务名称:W ...
- 《棋牌游戏服务器》斗地主AI设计
设计目标 要取得良好效果,首先要搞清楚一个问题:我们想得到一个什么样的斗地主AI?我们的AI是用在手游产品当中,在真实玩家不足时为用户提供陪玩服务,这个目标决定了这个AI要具备以下两个核心特点:1.执 ...
- UDP协议----简单的CS模型实现
UDP简单介绍 传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议.TCP协议在网络通信中占主导地位,绝大多数的网络通信借助TCP协议完成数据传输.但UDP也是网络通信中不可或缺 ...
- maven项目在eclipse的library中没有Maven Dependencies
今天使用maven创建了一个多模块的项目,在分别创建完父项目和各个子模块后,编译父项目的时候,父项目工程目录上出现了一堆红叉叉,点进去一看,是找不到依赖的类,但是pom文件中相应jar的depende ...
- Mybatis常见问题
1.#和$的区别和联系 1.1#是占位符,会对Sql进行预编译,相当于?:$是做Sql拼接,有sql注入的隐患 1.2#不需要关注数据类型,Mybatis自动实现类型转换,$必须自己判断数据类型联系 ...
- Mybatis plus 高级
最近项目重构 dao层使用的Mybatis plus,有必要总结下. Mybatis plus 会自动维护Mybatis 以及 MyBatis-Spring 相关依赖 所以在构建项目时候 只需要引入 ...
- Android解决软键盘弹出将布局顶到上面
有时候我们在下面的布局是一个RadioGroup,然后当页面中的EditText获得焦点的时候,会将地步的RadioGroup顶起来,这时候我们只需要在AndroidMainfest中RadioGro ...