P1642 规划 01分数规划+树形DP
$ \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的更多相关文章
- P1642 规划 [01分数规划]
裸题,考虑size完了跑一个树上背包,这题没了. // by Isaunoya #include <bits/stdc++.h> using namespace std; #define ...
- [JSOI2016] 最佳团队 (树形DP+01分数规划)
Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号. 每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY ...
- BZOJ.4753.[JSOI2016]最佳团体(01分数规划 树形背包DP)
题目链接 \(Description\) 每个点有费用si与价值pi,要求选一些带根的连通块,总大小为k,使得 \(\frac{∑pi}{∑si}\) 最大 \(Solution\) 01分数规划,然 ...
- [JSOI 2016] 最佳团体(树形背包+01分数规划)
4753: [Jsoi2016]最佳团体 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2003 Solved: 790[Submit][Statu ...
- luogu 4377 Talent show 01分数规划+背包dp
01分数规划+背包dp 将分式下面的部分向右边挪过去,通过二分答案验证, 注意二分答案中如果验证的mid是int那么l=mid+1,r=mid-1,double类型中r=mid,l=mid; 背包dp ...
- bzoj5281/luogu4377 Talent Show (01分数规划+背包dp)
就是01分数规划的思路,只不过当把w[i]-r*t[i]>0的选完以后如果w值还没达到要求,那就再01背包dp一下就好了(dp时w值>W的时候就存在W里就不会爆内存了). (跑得很慢..大 ...
- BZOJ5281: [Usaco2018 Open]Talent Show(01分数规划&DP)
5281: [Usaco2018 Open]Talent Show Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 166 Solved: 124[S ...
- BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划
BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划 Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人 ...
- jzoj3454 表白(love)解题报告(01分数规划+DP)
题目链接:https://jzoj.net/senior/#contest/show/2414/2 题目描述: 鸡腿是CZYZ的著名DS,但是不想追妹子的DS不是好GFS,所以鸡腿想通过表白来达到他追 ...
随机推荐
- Spring Data JPA 参考指南 中文版
附下载地址:https://www.gitbook.com/book/ityouknow/spring-data-jpa-reference-documentation/details
- 9-queue
在C++中只要#include<queue>即可使用队列类,其中在面试或笔试中常用的成员函数如下(按照最常用到不常用的顺序) 1. push 2. pop 3. size 4. empty ...
- rsyslog收集nginx日志配置
rsyslog日志收集配置 rsyslog服务器收集各服务器的日志,并汇总,再由logstash处理 请查看上一篇文章 http://bbotte.blog.51cto.com/6205307/16 ...
- [C++] NEW Advanced Usage
NEW Advanced Usage 将分配的内存限定在特定的一块区域 #include<iostream> #include<new> ); ); }; using name ...
- 遍历properties文件
Properties pro = new Properties();try { InputStream inStr = ClassLoader.getSystemResourceAsStream ...
- Web测试实践-任务进度-Day02
小组成员 华同学.郭同学.覃同学.刘同学.穆同学.沈同学 任务进度 在经过任务分配阶段后,大家都投入到了各自的任务中,以下是大家今天任务的进度情况汇总. 华同学 & 刘同学(任务1) 1.对爱 ...
- mongodb ---- findAndModify 写法
db.coll.findAndModify({ query:{x:"ggg"}, update:{$set:{"x":"gggg"}}, f ...
- Maven整理笔记の生命周期和插件
项目构建的生命周期,其实软件开发人员每天都在干这个事,即项目清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等,可以说几乎所有项目的构建都可以映射到这样一个生命周期上. Maven的插件 ...
- maven-multiModule
主pom的定义 packaging:pom modules的指定 dependencyManagement的指定 properties的指定 build或profile的设置 子module的创建 在 ...
- Linux常用开发指令
gcc mysqltest.c -o mysqltest `mysql_config –cflags –libs`