$ \color{#0066ff}{ 题目描述 }$

某地方有N个工厂,有N-1条路连接它们,且它们两两都可达。每个工厂都有一个产量值和一个污染值。现在工厂要进行规划,拆除其中的M个工厂,使得剩下的工厂依然连成一片且 总产量/总污染 的值最大。

\(\color{#0066ff}{输入格式}\)

第一行N M(1<N<100,1<=M<N),表示工厂个数和要拆除的个数。

第二行N个正整数,表示每个工厂的产值[1..10000]

第三行N个正整数,表示每个工厂的污染值[1..10000]

接着N-1行,每行两个正整数a b(1<=a,b<=N)表示a,b之间相连。

\(\color{#0066ff}{输出格式}\)

总产量/总污染 的最大值,保留一位小数。

\(\color{#0066ff}{输入样例}\)

3 2
2 3 4
1 1 1
1 2
2 3

\(\color{#0066ff}{输出样例}\)

4.0

\(\color{#0066ff}{数据范围与提示}\)

none

\(\color{#0066ff}{题解}\)

显然是01分数规划问题,那么二分答案

现在的问题是找一个大小为m的联通块

经典树形DP,\(f[i][j]\)为以i为根子树选j个点的最大值(i必选)

跑树形背包即可,注意i必选的限制,所以要对所有点取max

#include<bits/stdc++.h>
#define LL long long
LL read() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
template<class T> bool chkmax(T &a, const T &b) { return a < b? a = b, 1 : 0; }
template<class T> bool chkmin(T &a, const T &b) { return b < a? a = b, 1 : 0; }
const int inf = 0x7fffffff;
const int maxn = 555;
const double eps = 1e-6;
int n, m, a[maxn], b[maxn], siz[maxn];
double f[maxn][maxn], val[maxn], mx;
std::vector<int> G[maxn];
void dfs(int x, int fa) {
siz[x] = 1;
f[x][0] = 0, f[x][1] = val[x];
for(auto to : G[x]) {
if(to == fa) continue;
dfs(to, x);
siz[x] += siz[to];
for(int i = std::min(m, siz[x]); i >= 1; i--)
for(int j = 0; j < i; j++)
chkmax(f[x][i], f[x][i - j] + f[to][j]);
}
chkmax(mx, f[x][m]);
}
bool ok(double mid) {
for(int i = 1; i <= n; i++)
for(int j = 0; j <= m; j++)
f[i][j] = -inf;
for(int i = 1; i <= n; i++) val[i] = (double)(a[i] - mid * b[i]);
mx = -1e18;
dfs(1, 0);
return mx >= 0;
} int main() {
n = read(), m = n - read();
for(int i = 1; i <= n; i++) a[i] = read();
for(int i = 1; i <= n; i++) b[i] = read();
int x, y;
for(int i = 1; i < n; i++) {
x = read(), y = read();
G[x].push_back(y);
G[y].push_back(x);
}
double l = 0, r = 105050;
while(r - l > eps) {
double mid = (l + r) / 2.0;
if(ok(mid)) l = mid;
else r = mid;
}
printf("%.1f\n", l);
return 0;
}

P1642 规划 01分数规划+树形DP的更多相关文章

  1. P1642 规划 [01分数规划]

    裸题,考虑size完了跑一个树上背包,这题没了. // by Isaunoya #include <bits/stdc++.h> using namespace std; #define ...

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

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

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

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

  4. [JSOI 2016] 最佳团体(树形背包+01分数规划)

    4753: [Jsoi2016]最佳团体 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2003  Solved: 790[Submit][Statu ...

  5. luogu 4377 Talent show 01分数规划+背包dp

    01分数规划+背包dp 将分式下面的部分向右边挪过去,通过二分答案验证, 注意二分答案中如果验证的mid是int那么l=mid+1,r=mid-1,double类型中r=mid,l=mid; 背包dp ...

  6. bzoj5281/luogu4377 Talent Show (01分数规划+背包dp)

    就是01分数规划的思路,只不过当把w[i]-r*t[i]>0的选完以后如果w值还没达到要求,那就再01背包dp一下就好了(dp时w值>W的时候就存在W里就不会爆内存了). (跑得很慢..大 ...

  7. BZOJ5281: [Usaco2018 Open]Talent Show(01分数规划&DP)

    5281: [Usaco2018 Open]Talent Show Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 166  Solved: 124[S ...

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

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

  9. jzoj3454 表白(love)解题报告(01分数规划+DP)

    题目链接:https://jzoj.net/senior/#contest/show/2414/2 题目描述: 鸡腿是CZYZ的著名DS,但是不想追妹子的DS不是好GFS,所以鸡腿想通过表白来达到他追 ...

随机推荐

  1. c# ftp 判断目录是否存在和创建文件夹

    工作中项目一直使用的ftp上传日志文件出现了问题,新的服务器搭建好后,日志无法上传.正好来学习一下ftp. 程序中的流程是,一个计时器,每分钟检测配置文件中本地日志文件路径下有没有日志文件,如果有就上 ...

  2. Opencv Harris角点检测

    #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...

  3. SVO详细解读

    SVO详细解读 极品巧克力 前言 接上一篇文章<深度滤波器详细解读>. SVO(Semi-Direct Monocular Visual Odometry)是苏黎世大学Scaramuzza ...

  4. realsense pcl git

    https://github.com/Ext4FAT/Registration vc++ pcl realsense  矿泉水瓶子 https://github.com/dBeker/PCL-Real ...

  5. ajax 整个表单的提交

    重点:data: $("#form1").serialize() function setSaveNext() { setSaveData(); var cx = pageInde ...

  6. jstack调试core文件

    摘自:https://stackoverflow.com/questions/37331266/jstack-throws-exception-interrogating-a-core // 错误示例 ...

  7. Perl 学习笔记-列表和数组

    笔记来自<<Perl语言入门第5版>> 1. Perl中列表指标量的有序集合,数组则是存储列表的变量, 这两个术语经常混用,不过更精确地说,列表指数据,而数组指变量.数组的表示 ...

  8. ServletRequest面试题

    使用request获得请求行:String getmethod():获得请求的资源:String getcontextpath():----web应用名称request是一个域对象request完成请 ...

  9. 视频分析(MATLAB)——MV分镜头图像分类

    引言:一个MV视频是有很多帧图像组合而成的,而一支MV是有多少个分镜头场景组合而成的呢?由MATLAB如何自动实现? 以<Love You Like A Love Song>的MV为例(这 ...

  10. 超级简单的例子说明JAVA PACKET CLASS 和变量之间的关系

    一.包PACKET 就是一个文件夹,包下的CLASS互相访问如一个文件. 二.class内部相当于一个DELPHI的calss,静态函数(static )只能访问静态函数. package Mainp ...