【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包
【题意】n个人,每个人有价值ai和代价bi和一个依赖对象ri<i,选择 i 时 ri 也必须选择(ri=0时不依赖),求选择k个人使得Σai/Σbi最大。n<=2500,ai,bi<=1e4。
【算法】01分数规划+树上背包
【题解】首先二分答案ans,根据01分数规划赋新的权值ci=ai-ans*bi,转化为是否能在树上找k个点使得权值和>=0。
设f[i][j]表示子树 i 选择 j 个点的最大权值和,然后做树上背包即可。
注意:第一维从大到小枚举j,第二维枚举儿子背包。这个背包比较特殊,是因为一批物品只能也必须取一个。
两个节点只在它们LCA处计算一次,所以只要背包不枚举满,均摊复杂度就是N^2。
总复杂度O(n^2*log ai)。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=;
const double inf=-; int first[maxn],n,K,a[maxn],b[maxn],tot,sz[maxn];
double f[maxn][maxn],c[maxn];
struct edge{int v,from;}e[maxn];
void insert(int u,int v){tot++;e[tot].v=v;e[tot].from=first[u];first[u]=tot;}
double max(double a,double b){return a<b?b:a;}
void dfs(int x){
for(int i=;i<=K;i++)f[x][i]=inf;
if(x)f[x][]=c[x],sz[x]=;else f[x][]=;
for(int i=first[x];i;i=e[i].from){
dfs(e[i].v);sz[x]+=sz[e[i].v];
for(int k=min(K,sz[x]);k>=;k--)//
for(int j=min(k-(x!=),sz[e[i].v]);j>=;j--)if(f[x][k-j]>inf+){
f[x][k]=max(f[x][k],f[x][k-j]+f[e[i].v][j]);
}else break;
}
}
bool solve(double ans){
for(int i=;i<=n;i++)c[i]=1.0*a[i]-ans*b[i];
dfs();
return f[][K]>=;
}
int main(){
scanf("%d%d",&K,&n);
double l=,r=,mid;
for(int i=;i<=n;i++){
int fa;
scanf("%d%d%d",&b[i],&a[i],&fa);
insert(fa,i);
}
r=1e4;//?
while(r-l>1e-){
mid=(l+r)/;
if(solve(mid))l=mid;else r=mid;
}
printf("%.3lf",l);
return ;
}
【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包的更多相关文章
- BZOJ.4753.[JSOI2016]最佳团体(01分数规划 树形背包DP)
题目链接 \(Description\) 每个点有费用si与价值pi,要求选一些带根的连通块,总大小为k,使得 \(\frac{∑pi}{∑si}\) 最大 \(Solution\) 01分数规划,然 ...
- BZOJ 4753 [Jsoi2016]最佳团体 ——01分数规划 树形DP
要求比值最大,当然用分数规划. 二分答案,转化为选取一个最大的联通块使得它们的和大于0 然后我们直接DP. 复杂度$O(n^2\log {n})$ #include <map> #incl ...
- BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包)
BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包) 标签:题解 阅读体验 BZOJ题目链接 洛谷题目链接 具体实现 看到分数和最值,考虑分数规划 我们要求的是一个\(\dfrac{ ...
- 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\)个候选人中选 ...
- bzoj 4753: [Jsoi2016]最佳团体【01分数规划+二分+树上背包】
01分数规划,二分答案然后把判别式变成Σp[i]-Σs[i]*mid>=0,然后树上背包判断,设f[i][j]为在i点子树里选j个的最大收益,随便背包一下就好 最丧病的是神卡常--转移的时候要另 ...
- bzoj 4753 [Jsoi2016]最佳团体——0/1分数规划
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4753 0/1分数规划裸题. #include<iostream> #includ ...
- bzoj4753: [Jsoi2016]最佳团体(分数规划+树形依赖背包)
菜菜推荐的“水题”虐了我一天T T...(菜菜好强强qwq~ 显然是个分数规划题,二分答案算出p[i]-mid*s[i]之后在树上跑依赖背包,选k个最大值如果>0说明还有更优解. 第一次接触树形 ...
- BZOJ4753 JSOI2016最佳团体(分数规划+树形dp)
看到比值先二分答案.于是转化成一个非常裸的树形背包.直接暴力背包的话复杂度就是O(n2),因为相当于在lca处枚举每个点对.这里使用一种更通用的dfs序优化树形背包写法.https://www.cnb ...
随机推荐
- 如何利用Xshell在Linux下安装jdk
本文会详细介绍如何在Linux下安装JDK1.8 首先要设置虚拟机的IP地址,不知道如何设置的话可以 翻看我的前一篇博客 http://www.cnblogs.com/xiaoxiaoSMILE/ ...
- 人生的第一篇blog
开始写博客了,人生第一篇博客啊,要写些什么呢?想想也没有什么头绪,随便写写吧. 这学期要使用代码管理工具了,要写团队项目了.一直以来都是自己一个人在默默编程,没有过合作经历.对于代码的管理也只是一直在 ...
- 太平洋网络ip地址查询接口使用,返回json格式,默认返回jsonp
http://whois.pconline.com.cn/ipJson.jsp?json=true
- PHP执行原理
简单解释:PHP执行原理 客户端向服务器发送一个请求,如果请求的是一个HTML页面,服务器直接将HTML页面发送到客户端给浏览器解析,如果请求的是PHP页面,则服务器会运行PHP页面然后生成标准的HT ...
- react-router之代码分离
概念 无需用户下载整个应用之后才能访问访问它.即边访问边下载.因此我们设计一个组件<Bundle>当用户导航到它是来动态加载组件. import loadSomething from 'b ...
- HSF源码剖析
前言 HSF是一个分布式的远程服务调用框架,其实我更喜欢把分布式几个字去掉,因为HSF本身并不是一个单独的服务(指一个进程),他是附属在你的应用里的一个组件,一个RPC组件(远程过程调用——Remot ...
- zepto中$.proxy()的到底有多强大?
好吧,其实是标题党了,哈哈,只是想总结一下工作中遇到$.proxy()的用法而已. 一.语法: $.proxy()有两种使用语法 1)$.proxy(fn,context),fn是一个函数,conte ...
- SpringMVC Ajax两种传参方式
1.采用@RequestParam或Request对象获取参数的方法 注:contentType必须指定为:application/x-www-form-urlencoded @ResponseBod ...
- 中国省市 Json 二级联动
Json数据: var cities = {'北京': ['北京'], '广东': ['广州', '深圳', '珠海', '汕头', '韶关', '佛山', '江门', '湛江', '茂名', '肇庆 ...
- 第191天:js---Array常用属性和方法总结
Array---常用属性和方法总结 1.Array对象构造函数 /*Array对象构造函数*/ /*组合记忆 shift unshift pop push 添加和删除 shift unshift 从数 ...