4753: [Jsoi2016]最佳团体

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 2003  Solved: 790
[Submit][Status][Discuss]

Description

JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号。方便起见,JYY的编号是0号。每个候选人都由一位
编号比他小的候选人Ri推荐。如果Ri=0则说明这个候选人是JYY自己看上的。为了保证团队的和谐,JYY需要保证,
如果招募了候选人i,那么候选人Ri"也一定需要在团队中。当然了,JYY自己总是在团队里的。每一个候选人都有
一个战斗值Pi",也有一个招募费用Si"。JYY希望招募K个候选人(JYY自己不算),组成一个性价比最高的团队。
也就是,这K个被JYY选择的候选人的总战斗值与总招募总费用的比值最大。
 

Input

输入一行包含两个正整数K和N。
接下来N行,其中第i行包含3个整数Si,Pi,Ri表示候选人i的招募费用,战斗值和推荐人编号。
对于100%的数据满足1≤K≤N≤2500,0<"Si,Pi"≤10^4,0≤Ri<i
 
 

Output

输出一行一个实数,表示最佳比值。答案保留三位小数。
 

Sample Input

1 2
1000 1 0
1 1000 1

Sample Output

0.001
题解:
一开始看到这题觉得是道水题,就和树上染色那道题一样,是个经典的$O(n^2)$的树上背包但是这道题不同的是转移有两个要素,并且这两个要素是作比的关系而不是简单的相加,一开始想两个分别转移,但是这两个东西他是同选取的,无法用正常方法维护,然后想了很长时间怎么进行转移,发现很不好转移,一点开标签发现需要一个新芝士点:01分数规划,然而自己不会啊qwq,上网学了一下,看了一下觉得也不是很难,大概介绍一下叭。
01分数规划:

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分数规划)的更多相关文章

  1. BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划

    BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划 Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人 ...

  2. [JSOI2016] 最佳团队 (树形DP+01分数规划)

    Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号. 每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY ...

  3. 解题:JSOI 2016 最佳团体

    题面 0/1分数规划+树形背包检查 要求$\frac{\sum P_i}{\sum S_i}的最大值,$按照0/1分数规划的做法,二分一个mid之后把式子化成$\sum P_i=\sum S_i*mi ...

  4. Bzoj4753/洛谷P4432 [JSOI2016]最佳团体(0/1分数规划+树形DP)

    题面 Bzoj 洛谷 题解 这种求比值最大就是\(0/1\)分数规划的一般模型. 这里用二分法来求解最大比值,接着考虑如何\(check\),这里很明显可以想到用树形背包\(check\),但是时间复 ...

  5. [JSOI 2016] 最佳团体

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4753 [算法] 很明显的分数规划 可以用树形动态规划(树形背包)检验答案 时间复杂度 ...

  6. BZOJ.4753.[JSOI2016]最佳团体(01分数规划 树形背包DP)

    题目链接 \(Description\) 每个点有费用si与价值pi,要求选一些带根的连通块,总大小为k,使得 \(\frac{∑pi}{∑si}\) 最大 \(Solution\) 01分数规划,然 ...

  7. 【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包

    [题意]n个人,每个人有价值ai和代价bi和一个依赖对象ri<i,选择 i 时 ri 也必须选择(ri=0时不依赖),求选择k个人使得Σai/Σbi最大.n<=2500,ai,bi< ...

  8. bzoj 4753: [Jsoi2016]最佳团体【01分数规划+二分+树上背包】

    01分数规划,二分答案然后把判别式变成Σp[i]-Σs[i]*mid>=0,然后树上背包判断,设f[i][j]为在i点子树里选j个的最大收益,随便背包一下就好 最丧病的是神卡常--转移的时候要另 ...

  9. BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划

    BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划 又是一道卡精度卡得我头皮发麻的题-- 题面(--蜜汁改编版) YL大哥是24OI的大哥,有一天,他想要从\(N\)个候选人中选 ...

随机推荐

  1. cmake 升级

    cmake 升级 1下载   cmake-3.1.0.tar.gz2.解压 3.执行  ./configure 4.执行 make 5. 执行   sudo make install 6.添加环境变量 ...

  2. eclipse导入maven空项目,eclipse导入时不识别maven项目

    经常我们在网上下载的一些开源项目中,想要导入eclipse中,却发现eclipse不识别这个项目,这时候怎么办呢? 解决办法多种多样,我这里举例出最实用的2种: 1.在项目的根目录中加入.classp ...

  3. 《深入理解 Java 虚拟机》学习 -- Java 内存模型

    <深入理解 Java 虚拟机>学习 -- Java 内存模型 1. 区别 这里要和 JVM 内存模型区分开来: JVM 内存模型是指 JVM 内存分区 Java 内存模型(JMM)是指一种 ...

  4. Servlet获取JSP中的汉字乱码问题解决方案

    1.String customerName=request.getParameter("customer_name");这样会出现乱码 解决方案很简单: String custom ...

  5. 微信小程序修改radio和checkbox的默认样式和图标

    wxml: <view class="body"> <view class="body-content"> 第1题:企业的价值观是 ? ...

  6. MSP432 BSL流程(UART)

    升级流程 PC程序会解析脚本中的命令,根据命令码做相应的操作.数据来自于命令后的文件(当前目录下的数据文件) # cat script_P4xx_uart.txt LOG //记录日志 MODE P4 ...

  7. 用window.showModalDialog()打开的页面Request.UrlReferrer为null

    今天在解决一个问题,怎么也找不到解决方案.我的一个窗体是IE通过window.showModalDialog()打开的,但为了防止用户手工输的地址,所以我需要判断是通过别的页面调整获得,用Reques ...

  8. OpenCV入门学习资料汇总

    OpenCV学习文档资料 OpenCV学习:1)OpenCV中文网站——http://wiki.opencv.org.cn/index.php/%E9%A6%96%E9%A1%B5 2)python实 ...

  9. 玩转springcloud(一):什么是Springcloud ,有什么优缺点? 学习顺序是什么?

    一.首先看官方解释: Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线).分布式系统的协调导致了样板模式, 使 ...

  10. STM32F407 CAN发送注意事项

    STM32使用的baseCAN,使用过程中发现一些注意的事项,特此记录. 现象: CAN发送程序,在1ms以上间隔调用时,一切正常. 当连续调用CAN发送程序4次或更多时,表现为丢数据,仅能发送一条或 ...