[JSOI 2016] 最佳团体(树形背包+01分数规划)
4753: [Jsoi2016]最佳团体
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 2003 Solved: 790
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1000 1 0
1 1000 1
Sample Output
01分数规划,简单的来说,就是有一些二元组$(s_i,p_i)$,从中选取一些二元组,使得$\Sigma{s_i}/\Sigma{p_i}$最大(最小)。
这种题一类通用的解法就是,我们假设$x= \Sigma{s_i}/\Sigma{p_i}$的最大(小)值,那么就有$x*\Sigma{p_i}=\Sigma{s_i}$,即$\Sigma{s_i}-x*\Sigma{p_i}=0$。也就是说,当某一个值x满足上述式子的时候,它就是要求的值。我们可以想到枚举……不过再想想,这个可以二分答案。
所以我们直接二分答案,当上述式子>0,说明答案小了,<0则说明答案大了,这样计算即可。
好了,前置芝士解决了,那实际上这题就是道01分数规划和$O(n^2)$树形背包的裸题了,还有要注意的就是初始化问题,尤其注意的是每次二分答案都要再给dp数组附上初值,其实每次check的就是dp数组,即dp数组的值就是x。最后要注意的一点是因为他题目中说自己必须选,并且不计入总人数,所以要k++。
总时间复杂度$O(n^2logn)$,稍卡常,luogu上要开O2。
完结撒花。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<cstdlib>
using namespace std;
const int N=;
const double eps=1e-;
int first[N],nex[N<<],to[N<<],tot;
int vis[N],size[N];
int n,k;
int att[N],co[N],ri[N];
double TerStegen[N];
double f[N][N];
void add(int a,int b){ to[++tot]=b,nex[tot]=first[a],first[a]=tot;}
void dfs(int x){
vis[x]=;size[x]=;
f[x][]=TerStegen[x];//
for(int i=first[x];i;i=nex[i]){
int y=to[i];
//if(vis[y]) continue;//danxiangbian
dfs(y);
for(int j=min(size[x],k);j>=;j--) for(int l=min(size[y],k);l>=;l--) f[x][l+j]=max(f[x][l+j],f[y][l]+f[x][j]);//dayudengyu1?
size[x]+=size[y];
}
}
int check(double mid){
int ju;
for(int i=;i<=;i++) for(int j=;j<=;j++) f[i][j]=-;
//memset(f,0xcf,sizeof(f));
for(int i=;i<=n;i++) f[i][]=0.0;
for(int i=;i<=n;i++) TerStegen[i]=1.0*att[i]-1.0*mid*1.0*co[i];
dfs();
//cout<<f[0][k]<<endl;
if(f[][k]>=) ju=;
else ju=;
return ju;
}
int main(){
scanf("%d%d",&k,&n);
k++;//duliu
for(int i=;i<=n;++i){
scanf("%d%d%d",&co[i],&att[i],&ri[i]);
add(ri[i],i);
}
double l=0.0,r=2e7*1.0;
double ans;
while(l+eps<r){
double mid=(l+r)/;
//cout<<mid<<" "<<l<<" "<<r<<endl;
if(check(mid)) l=mid;
else r=mid;
}
printf("%.3lf",(l+r)/);
}
[JSOI 2016] 最佳团体(树形背包+01分数规划)的更多相关文章
- BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划
BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划 Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人 ...
- [JSOI2016] 最佳团队 (树形DP+01分数规划)
Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号. 每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY ...
- 解题:JSOI 2016 最佳团体
题面 0/1分数规划+树形背包检查 要求$\frac{\sum P_i}{\sum S_i}的最大值,$按照0/1分数规划的做法,二分一个mid之后把式子化成$\sum P_i=\sum S_i*mi ...
- Bzoj4753/洛谷P4432 [JSOI2016]最佳团体(0/1分数规划+树形DP)
题面 Bzoj 洛谷 题解 这种求比值最大就是\(0/1\)分数规划的一般模型. 这里用二分法来求解最大比值,接着考虑如何\(check\),这里很明显可以想到用树形背包\(check\),但是时间复 ...
- [JSOI 2016] 最佳团体
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4753 [算法] 很明显的分数规划 可以用树形动态规划(树形背包)检验答案 时间复杂度 ...
- BZOJ.4753.[JSOI2016]最佳团体(01分数规划 树形背包DP)
题目链接 \(Description\) 每个点有费用si与价值pi,要求选一些带根的连通块,总大小为k,使得 \(\frac{∑pi}{∑si}\) 最大 \(Solution\) 01分数规划,然 ...
- 【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包
[题意]n个人,每个人有价值ai和代价bi和一个依赖对象ri<i,选择 i 时 ri 也必须选择(ri=0时不依赖),求选择k个人使得Σai/Σbi最大.n<=2500,ai,bi< ...
- bzoj 4753: [Jsoi2016]最佳团体【01分数规划+二分+树上背包】
01分数规划,二分答案然后把判别式变成Σp[i]-Σs[i]*mid>=0,然后树上背包判断,设f[i][j]为在i点子树里选j个的最大收益,随便背包一下就好 最丧病的是神卡常--转移的时候要另 ...
- BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划
BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划 又是一道卡精度卡得我头皮发麻的题-- 题面(--蜜汁改编版) YL大哥是24OI的大哥,有一天,他想要从\(N\)个候选人中选 ...
随机推荐
- 利用Python进行数据分析_Numpy_基础_1
ndarray:多维数组 ndarray 每个数组元素必须是相同类型,每个数组都有shape和dtype对象. shape 表示数组大小 dtype 表示数组数据类型 array 如何创建一个数组? ...
- js date对象传参获取特定日期的时间戳
当我们想要通过js获取某一特定时间的时间戳时,会通过给date对象传参再通过getTime函数来获取,传递的参数格式也有不同形式.有些时候,可能会因为自己传入参数的格式不正确而导致date对象inva ...
- CodeFirst实体类中,为什么都把ICollection<x>定义成virtual?
主要是用于延迟加载,提高性能用的 只有定义成virtual后才可以延迟加载. 延迟加载,默认情况下,延迟加载被支持,如果你希望禁用它,必须显式声明,最好的位置是在 DbContext 的构造器中. p ...
- str.charAt()与str[]的区别
str.charAt():只能显示当前字符,没有则显示空. str[]:当索引超出当前字符长度时,则显示undefined.
- mycat sql timeout 问题解决
发现程序中有个批量update语句需要update 16000多条数据导致超时 2019-11-06 10:35:28.312 pool-9-thread-24 ERROR com.hp.nova.c ...
- java实现判定新旧版本号
废话不多说,直接上代码 /** * 判断是否为最新版本方法 将版本号根据.切分为int数组 比较 * * @param localVersion 本地版本号 * @param onlineVersio ...
- debian上安装tmux
1.安装ncurses库 1.1.获取源码 wget https://invisible-island.net/datafiles/release/ncurses.tar.gz tar xvf ncu ...
- WPF实战案例-MVVM模式下用附加属性在Xaml中弹出窗体
嗯..最近回家去了,2个月没写过代码了,面试只能吹牛,基础都忘了,今天回顾一下,分享一篇通过附加属性去处理窗体弹出的情况. 或许老司机已经想到了,通过设置附加属性值,值变更的回调函数去处理窗体弹出,是 ...
- python面向对象:组合、封装、property装饰器、多态
一.组合二.封装三.property装饰器四.多态 一.组合 ''' 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. ...
- java_实现Hello World
1.新建项目 在空白处右击--New--java Project 2.项目文件结构 新建了项目之后项目文件在工作空间里面,(如果忘记工作空间的路径可以点击File---Switch Workspace ...