bzoj4753[JSOI2016]最佳团体
题意:01分数规划,但可选的数字之间存在森林形的依赖关系(可以认为0号点是个虚根,因为并不能选).
虽然有森林形的依赖关系,但还是可以套分数规划的思路,二分答案k,判断是否存在一个比值大于k的方案
即是否存在一种选取方式使得sigma{fight[i],i is choosed}/sigma{cost[i],i is choosed}>=k
移项,发现只需要sigma{fight[i]-cost[i]*k,i is choosed}>=0,也就是把每个点的权值设置成”战斗力-花费*比值”,判断是否存在一种满足依赖关系的选取方案使得选择的权值之和>=0,那么让权值之和尽量大判定最大值是否大于等于0即可.定义f[i][j]表示i为根的子树中选取j个点时的最大权值,用背包暴力转移,看似是O(n^3)的,但仔细分析发现复杂度是O(n^2)的,因为每次合并一棵子树时付出的代价是”已经合并的兄弟子树的大小之和”*”正在合并的这棵子树的大小”,实质上是树上每对节点在LCA处贡献时间复杂度,这一部分相当于bzoj4033.
于是总体复杂度是O (log(ans)*N^2),n是2500,感觉很虚但是能跑过去…注意处理某棵子树如果选择那么子树的根节点必须选择,以及0号节点的处理.再有就是二分精度一定要调好.
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
struct edge{
int to,next;
}lst[maxn];int first[maxn],len=;
void addedge(int a,int b){
lst[len].to=b;lst[len].next=first[a];first[a]=len++;
}
int k,n;
int cost[maxn],fight[maxn],prt[maxn],sz[maxn];
double w[maxn];
double f[maxn][maxn];
void dfs(int x){
sz[x]=;
for(int pt=first[x];pt;pt=lst[pt].next){
dfs(lst[pt].to);
sz[x]+=sz[lst[pt].to];
}
}
void dp(int x){
int tot=;
if(x)f[x][]=w[x],tot=;
else f[x][]=;
for(int pt=first[x];pt;pt=lst[pt].next){
dp(lst[pt].to);tot+=sz[lst[pt].to];
for(int i=tot;i>=;--i){
for(int j=;j<=sz[lst[pt].to]&&j<=i;++j){
f[x][i]=max(f[x][i],f[x][i-j]+f[lst[pt].to][j]);
}
}
} }
bool check(double ans){
for(int i=;i<=n;++i){
w[i]=fight[i]-ans*cost[i];
}
memset(f,0xc2,sizeof(f));
dp();//printf("%.3f\n",f[2][1]);
return f[][k]>=;
}
int main(){
scanf("%d%d",&k,&n);
for(int i=;i<=n;++i){
scanf("%d%d%d",&cost[i],&fight[i],&prt[i]);addedge(prt[i],i);
}
dfs();
double l=,r=1e4;
while(r-l>1e-){
double mid=(l+r)/;
if(check(mid))l=mid;
else r=mid;
}
printf("%.3f\n",(r+l)/);
return ;
}
bzoj4753[JSOI2016]最佳团体的更多相关文章
- BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包)
BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包) 标签:题解 阅读体验 BZOJ题目链接 洛谷题目链接 具体实现 看到分数和最值,考虑分数规划 我们要求的是一个\(\dfrac{ ...
- BZOJ4753 JSOI2016最佳团体(分数规划+树形dp)
看到比值先二分答案.于是转化成一个非常裸的树形背包.直接暴力背包的话复杂度就是O(n2),因为相当于在lca处枚举每个点对.这里使用一种更通用的dfs序优化树形背包写法.https://www.cnb ...
- bzoj4753: [Jsoi2016]最佳团体(分数规划+树形依赖背包)
菜菜推荐的“水题”虐了我一天T T...(菜菜好强强qwq~ 显然是个分数规划题,二分答案算出p[i]-mid*s[i]之后在树上跑依赖背包,选k个最大值如果>0说明还有更优解. 第一次接触树形 ...
- BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划
BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划 又是一道卡精度卡得我头皮发麻的题-- 题面(--蜜汁改编版) YL大哥是24OI的大哥,有一天,他想要从\(N\)个候选人中选 ...
- 【BZOJ4753】最佳团体(分数规划,动态规划)
[BZOJ4753]最佳团体(分数规划,动态规划) 题面 BZOJ Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一 ...
- 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\)号.每个候 ...
- 【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp
题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了 ...
- [Jsoi2016]最佳团体 BZOJ4753 01分数规划+树形背包/dfs序
分析: 化简一下我们可以发现,suma*ans=sumb,那么我们考虑二分ans,之后做树形背包上做剪枝. 时间复杂度证明,By GXZlegend O(nklogans) 附上代码: #includ ...
随机推荐
- elk6.3.2在线安装中文分词工具IK
1.进入ES目录并执行安装(注意版本号改成你需要的版本) cd /usr/share/elasticsearch ./bin/elasticsearch-plugin install https:// ...
- 成都Uber优步司机奖励政策(4月8日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- angular ng-bind-html $sce.trustAsHtml
使用ng-bind-html和$sce.trustAsHtml显示有html符号的内容 angularjs的强大之处之一在于它的双向数据绑定的功能,我们通常会使用data-ng-bind或者dat ...
- java中i=i++的解析
int i = 0; i = i++; //答案是0 System.out.println(i); 执行以上代码,奇怪的是打印出来i的结果是0,说简单点,i++是一个表达式,是有返回值的,返回的是自增 ...
- lesson 18 Electric currents in modern art
lesson18 Electric currents in modern art electricity n. 电力:电流; electric adj. 电的:电动的; electronic adj. ...
- Python中一些糟糕的语法!你遇到过吗?还知道那些?
Python是一门语法优雅,功能强大,开发效率高,应用领域广泛的解释性语言. 其有非常多的优点,但是也并不是完美的,除了大家都知道的执行速度不够快,Python2和Python3的兼容问题,以及GIL ...
- (Python爬虫04)了解通用爬虫和聚焦爬虫,还是理论知识.快速入门可以略过的
如果现在的你返回N年前去重新学习一门技能,你会咋做? 我会这么干: ...哦,原来这个本事学完可以成为恋爱大神啊, 我要掌握精髓需要这么几个要点一二三四..... 具体的学习步骤是这样的一二三.... ...
- lintcode112 删除排序链表中的重复元素
删除排序链表中的重复元素 给定一个排序链表,删除所有重复的元素每个元素只留下一个. 您在真实的面试中是否遇到过这个题? Yes 样例 给出 1->1->2->null,返回 1- ...
- [Clr via C#读书笔记]Cp4类型基础
Cp4类型基础 Object类型 Object是所有类型的基类,有Equals,GetHashCode,ToString,GetType四个公共方法,其中GetHashCode,ToString可以o ...
- Wordcount -- MapReduce example -- Mapper
Mapper maps input key/value pairs into intermediate key/value pairs. E.g. Input: (docID, doc) Output ...