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,所以鸡腿想通过表白来达到他追 ...
随机推荐
- jQuery autocomplete -默认
<!doctype html> <html> <head> <meta name="content-type" content=" ...
- Python使用struct处理二进制(pack和unpack用法)
转载自:http://www.cnblogs.com/gala/archive/2011/09/22/2184801.html 这篇文章写的很好,所以无耻的转了.. 有的时候需要用python处理二进 ...
- Spring MVC拦截器(Interceptor )详解
处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. 常见应用场 ...
- jQuery中deferred对象的使用(二)
接上一回的内容,漏了一个always()方法,参数也是回调函数,与done和fail不同的是,无论任何情况都执行always方法中的回调. deferred对象的使用(二) deferred对象不光可 ...
- HUST软测1504班第2周作业成绩:WordCount
说明 本次公布的成绩为第2周个人作业WordCount的结果: 第2周个人作业:WordCount 如果同学对作业结果存在异议,可以: 在毕博平台讨论区的第2周作业第在线答疑区发帖申诉. 或直接在博客 ...
- 开源SLAM
GitHub 上优秀的开源SLAM repo (更新中):https://www.jianshu.com/p/464ca0d0c254 当前的开源SLAM方案:https://www.cnblogs. ...
- C#中遇到的方法总结
1.Select(string filterExpression, string sort) // 获取按照指定的排序顺序且与筛选条件相匹配的所有 System.Data.DataRow 对象的数组 ...
- 解决word2013老是打开未响应情况
问题:自己装了word2013时,每次打开word或者工作时,老是出现一个圈圈,提示未反应,是否关闭程序这样的提示: 解决方法:文件->选项->高级->显示->禁用硬件加速,将 ...
- java学习(六)面向对象 final关键字 多态
1.被fnial修饰的方法不能被重写,常见的为修饰类,方法,变量 /* final可以修饰类,方法,变量 特点: final可以修饰类,该类不能被继承. final可以修饰方法,该方法不能被重写.(覆 ...
- Linq集合操作之Intersect,Except,Union源码分析
Linq集合操作之Intersect,Except,Union源码分析 linq的集合运算 常见的集合运算有哪些? 这三个扩展方法在我们实际使用中用的还是非常多的,而且这里还涉及到了“复杂度” 无算法 ...