题目链接

loj#2071. 「JSOI2016」最佳团体

题解

树形dp强行01分规

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define gc getchar()
#define pc putchar
inline int read() {
int x = 0,f = 1;
char c = gc;
while(c < '0' || c > '9') c = gc;
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar();
return x * f;
}
void print(int x) {
if(x < 0) {
pc('-');
x = -x;
}
if(x >= 10) print(x / 10);
pc(x % 10 + '0') ;
}
#define eps 1e-3
const int maxn = 2505;
struct node {
int next,v;
} edge[maxn << 1];
int head[maxn], num = 0;
void add_edge(int x,int v) {
edge[++ num].v = v;
edge[num].next = head[x];
head[x] = num;
}
int n,k ;
double ans = -1.000;
int s[maxn],p[maxn],siz[maxn];
double val[maxn];
double dp[maxn][maxn];
double tmp[maxn];
void dfs(int x,int fa) {
siz[x] = 0;
dp[x][0] = 0.0;
for(int i = head[x];i;i = edge[i].next) {
int v = edge[i].v;
if(v == fa) continue;
dfs(v,x);
for(int j = 0;j <= siz[x] + siz[v];++ j) tmp[j] = -74123423432.123;
for(int j = 0;j <= siz[x];++ j) {
for(int k = 0;k <= siz[v]; ++ k) {
tmp[k + j] = std::max(tmp[k + j], dp[x][j] + dp[v][k]);
}
}
siz[x] += siz[v];
for(int i = 0;i <= siz[x];++ i) dp[x][i] = tmp[i];
}
++ siz[x];
for(int i = siz[x];i >= 1;-- i) dp[x][i] = dp[x][i - 1] + val[x];
}
bool check(double mid) {
for(int i = 0;i <= n;++ i)
val[i] = 1.0 * p[i] - 1.0 * mid * s[i];
dfs(0,0);
return dp[0][k + 1] >= 0.0;
}
int main() {
//freopen("team0.in","r",stdin);
k = read(),n = read();
for(int fa,i = 1;i <= n;++ i) {
s[i] = read(),p[i] = read(),fa = read();
add_edge(fa,i); add_edge(i,fa);
}
double l = 0,r = 1000.0;
int cnt = 30 ;
while(cnt --) {
double mid = (r + l) / 2.0;
if(check(mid)) ans = mid,l = mid;
else r = mid;
}
printf ("%.3lf\n",l);
return 0;
} /*
1 2
1000 1 0
1 1000 1
*/

最新文章

  1. Not a git repository (or any of the parent directories): .git
  2. 我的ORM之六-- 批量
  3. [AngularJS] jQuery时代
  4. awstats 日志分析工具linux下的安装和使用
  5. [leetCode][003] Intersection of Two Linked Lists
  6. 记一次MySql入库后,文本出现乱码的问题
  7. ScriptManager.RegisterStartupScript方法和Page.ClientScript.RegisterStartupScript() 区别
  8. GridView ItemCommand
  9. Html学习_style属性应用
  10. python-列表、字典、元组的员工信息处理接口(第二篇(五):基于列表、字典和元组的员工信息处理接口)
  11. 一个Windows C++的线程类实现
  12. Angular2 Service实践——实现简单音乐播放服务
  13. 如何使用EasyUI显示表格界面
  14. HTML事件属性
  15. 使用InternalsVisibleTo给assembly添加“友元assembly”
  16. makefile笔记6 - makefile条件判断
  17. 缓存系列之四:redis持久化与redis主从复制
  18. [No0000C6]Visual Studio 2017 函数头显示引用个数
  19. Window环境下,PHP调用Python脚本
  20. Oracle / PLSQL函数 - LENGTH和LENGTHB

热门文章

  1. openstack swift节点安装手册3-最后的安装配置及验证
  2. spring初识
  3. java模拟form上传数据
  4. [学习笔记]Java代码中各种类型变量的内存分配机制
  5. 输入一个数,求1到他 的和(for循环)
  6. php中类继承和接口继承的对比
  7. 性能测试二十九:Dubbo框架测试脚本编写
  8. Date对象和Time对象
  9. ASP.NET Core 2 学习笔记(九)模型绑定
  10. jQuery源码中的“new jQuery.fn.init()”什么意思?