俺太难了

记录一下我调了一个小时的错误

  1. 多测不清空
  2. 多测清空只清空了\(vector\)
  3. 多测全清空了,但是忘了清空\(vector[0]\)
  4. \(priority\)_ \(queue\)把\(greater\)打成了\(less\)

佛枯了

题解

这题都告了是树了

可以很容易的想到一个贪心策略:

某节点的儿子数是\(a[i]\),则我们需要选\((a[i] * T - 1) / 100 + 1\)个子节点,那么现在这个节点的儿子数越少越好

另外,我们可以发现这题从根节点到子节点的时候不符合无后效性,举个栗子:

很显然选左边那棵子树是更优的,但是要是从上往下贪心的话我们就会选择右边的子树

所以我们只能从叶节点向根节点贪心

这个贪心我们用树上\(dp\)实现,用\(vector\)存图,用\(ans\)数组存选当前节点的话需要多少个叶节点

首先用\(vector\)存图,我们就能知道每个点的儿子的数量(不是子树大小),接着从根向下\(dfs\),顺手搞一个优先队列,回溯的时候顺带求出了\(ans\)数组,然后把\(ans\)数组放进优先队列,然后用前 \((a[i] * T - 1) / 100 + 1\) 小的子节点\(ans\)值更新当前点的\(ans\)值就可以了

代码如下

#include<bits/stdc++.h>
using namespace std;
#define rint register int
int n, T, ans[100010];
vector< int > a[100010];
inline int read( void ){
int re = 0, f = 1;
char ch = getchar();
while( ch > '9' || ch < '0' ){
if( ch == '-' ) f = -1;
ch = getchar();
}
while( ch <= '9' && ch >= '0' ){
re = re * 10 + ch - '0';
ch = getchar();
}
return re * f;
}
inline void dfs( int now, int fa ){
if( !a[now].size() ){
ans[now] = 1; return ;
}//边界条件
priority_queue< int, vector< int >, greater< int > > que;
for( rint i = 0; i < a[now].size(); i++ ){
rint v = a[now][i];
dfs( v, now );
que.push( ans[v] );//入队
}
int tmp = ( a[now].size() * T - 1 ) / 100 + 1;//需要工人的个数
for( rint i = 1; i <= tmp; i++ ){
int v = que.top(); que.pop(); ans[now] += v;
}
return ;
}
int main( void ){
while( 1 ){
n = read(); T = read();
for( rint i = 0; i <= n; i++ ) a[i].clear(); memset( ans, 0, sizeof( ans ) );
if( n == 0 && T == 0 ) break ;
for( rint i = 1; i <= n; i++ ){
int temp; temp = read();
a[temp].push_back( i );
}
dfs( 0, 0 );
cout << ans[0] << endl;
}
return 0;
}

题解 UVA12186 【工人的请愿书 Another Crisis】的更多相关文章

  1. UVA12186 工人的请愿书 Another Crisis (树形DP)

    dp[i]表示要让i向上级发请愿书,最少需要多少个工人递交请愿书,因为要取前T%最小的,所以还要将i的子节点排序(这里用vector实现),取前c个最小的作为dp[i]的值. 这里用dfs可以省去dp ...

  2. Uva 12186 工人的请愿书

    题目链接:https://uva.onlinejudge.org/external/121/12186.pdf 题意: 给出一个树状关系图,公司里只有一个老板编号为0,其他人员从1开始编号.除了老板, ...

  3. UVA - 12186 Another Crisis(工人的请愿书)(树形dp)

    题意:某公司有1个老板和n(n<=105)个员工组成树状结构,除了老板之外每个员工都有唯一的直属上司.老板的编号为0,员工编号为1~n.无下属的员工(叶子)打算签署一项请愿书递给老板,但不能跨级 ...

  4. UVa 12186 工人的请愿书(树形DP)

    https://vjudge.net/problem/UVA-12186 题意: 一个老板和n个员工组成树状结构,每个员工都有自己的唯一上司,老板的编号为0,员工1~n,工人们打算签署一个志愿书给老板 ...

  5. UVa 12186 Another Crisis 工人的请愿书

    c表示某上司上报的最少请愿下属,k表示总下属c=0.01T*k=kT/100(0.01T*k是整数)c=[0.01T*k]+1=[kT/100]+1(0.01T*k不是整数) kT=100 c=1 k ...

  6. 题解 洛谷P1281 【书的复制】

    蒟蒻的\(DP\)很菜,\(SO\)我准备上一套二分的玄学操作 一.简单的二分答案 二分主要是用来解决一些最值问题,它可以有效的优化暴力,使复杂度减少到\(O(logn)\). 我先给大家介绍一下二分 ...

  7. UVa 12186 Another Crisis

    题意: 给出一个树状关系图,公司里只有一个老板编号为0,其他人员从1开始编号.除了老板,每个人都有一个直接上司,没有下属的员工成为工人. 工人们想写一份加工资的请愿书,只有当不少于员工的所有下属的T% ...

  8. UVA12186

    给出一个树状关系图,公司里只有一个老板编号为0,其他人员从1开始编号.除了老板,每个人都有一个直接上司,没有下属的员工成为工人. 工人们想写一份加工资的请愿书,只有当不少于员工的所有下属的T%人递交请 ...

  9. 【学时总结】◆学时·VIII◆ 树形DP

    ◆学时·VIII◆ 树形DP DP像猴子一样爬上了树……QwQ ◇ 算法概述 基于树的模型,由于树上没有环,满足DP的无后效性,可以充分发挥其强大统计以及计算答案的能力. 一般来说树形DP的状态定义有 ...

随机推荐

  1. Django的乐观锁与悲观锁实现

    1)     事务概念 一组mysql语句,要么执行,要么全不不执行.  2)  mysql事务隔离级别 Read Committed(读取提交内容) 如果是Django2.0以下的版本,需要去修改到 ...

  2. 《JavaScript算法》常见排序算法思路与代码实现

    冒泡排序 通过相邻元素的比较和交换,使得每一趟循环都能找到未有序数组的最大值或最小值. 最好:O(n),只需要冒泡一次数组就有序了. 最坏: O(n²) 平均: O(n²) *单项冒泡 functio ...

  3. 6.8.5 使用Lambda表达式调用Arrays的类方法

    6.8.5 使用Lambda表达式调用Arrays的类方法 实例 Arrays类的有些方法需要Comparator. XxxOperator.XxxFunction等接口的实例,这些接口都是函数式接口 ...

  4. Springboot整合Dubbo和Zookeeper

    Dubbo是一款由阿里巴巴开发的远程服务调用框架(RPC),其可以透明化的调用远程服务,就像调用本地服务一样简单.截至目前,Dubbo发布了基于Spring Boot构建的版本,版本号为0.2.0,这 ...

  5. oppo互联网招聘-各类软件测试

    一.服务端测试专家 关键词:安全测试.白盒测试.性能测试.自动化.持续集成.服务端 岗位职责: 主导多个高日活产品的测试方案: 试点和推广自动化和持续集成: 改善测试相关流程和规范. 职位要求: 计算 ...

  6. 安卓权威编程指南-笔记(第24章 Looper Handler 和 HandlerThread)

    AsyncTask是执行后台线程的最简单方式,但它不适用于那些重复且长时间运行的任务. 1. Looper Android中,线程拥有一个消息队列(message queue),使用消息队列的线程叫做 ...

  7. 爬虫cookies详解

    cookies简介 cookie是什么? Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密).定义于 ...

  8. 一起了解 .Net Foundation 项目 No.8

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. IdentityModel ...

  9. 最强加密算法?AES加解密算法Matlab和Verilog实现

    目录 背景 AES加密的几种模式 基本运算 AES加密原理 Matlab实现 Verilog实现 Testbench 此本文首发于公众号[两猿社],重点讲述了AES加密算法的加密模式和原理,用MATL ...

  10. 编写一个可复用的SpringBoot应用运维脚本

    前提 作为Java开发者,很多场景下会使用SpringBoot开发Web应用,目前微服务主流SpringCloud全家桶也是基于SpringBoot搭建的.SpringBoot应用部署到服务器上,需要 ...