题解转自:http://blog.sina.com.cn/s/blog_7c060f190100r4cr.html 自己不想再写了……囧……   题意:以树作为载体,模拟一个游戏。大致规则就是在叶节点上放若干石子,每当一个节点的子节点都有石子时,子节点的石子可以拿掉,在这个节点上放置一个石子,其他石子继续用,直到根节点有石子为止,求出需要的最少的石子。   对任意一个节点,只有当他的所有子节点全部被占时,这个点才可能被占。而要占据它的全部子节点,需要多少石子呢?显然,递归之!假设我们已经知道了这所有子节点所需石子数,将其排序。这样,就出现了两种情况: 1、各节点所需石子数均不相同,假设需要石子数关系为an>an-1>…>a1,因为占据这个节点需要一个石子。所以,加入我们取an个石子,先占节点n,因为(an)-1>=an-1,所以占an-1节点的石子数也足够了,以此类推,最少需要an个石子。 2、存在石子数相同的节点,假设石子数关系为an=an-1=…=ai-1>ai,因为每个节点都消耗一个石子,所以ai最多需要(ai)+i-1个石子。 从上面两种情况总结来看,在整个过程中,只需比较(ai)+i-1的大小并将其排序,最大值就是占据这个节点所需的最小石子数。


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MID(x,y) ((x+y)>>1)
using namespace std;
typedef long long LL;vector  child[205];
bool vis[205];
bool cmp(int a, int b){return a > b;
}
int solve(int p){vis[p] = 1;if (child[p].size() == 0)return 1;else{int step[205];memset(step, 0, sizeof(step));for (int i = 0; i < (int)child[p].size(); i ++){step[i] = solve(child[p][i]);}sort(step, step + (int)child[p].size(), cmp);int ret = step[0];for (int i = 1; i < (int)child[p].size(); i ++){ret = max(ret, step[i] + i);}return ret;}
}
int main(){int M, N;scanf("%d", &M);while(M --){memset(vis, 0, sizeof(vis));for (int i = 0; i < 205; i ++)child[i].clear();scanf("%d", &N);for (int i = 0; i < N; i ++){int root, sonnum, son;scanf("%d %d", &root, &sonnum);for (int j = 0; j < sonnum; j ++){scanf("%d", &son);child[root].push_back(son);}}printf("%d\n", solve(1));}return 0;
}

转载于:https://www.cnblogs.com/AbandonZHANG/archive/2013/02/19/4114221.html

POJ 1694 An Old Stone Game ★(排序+树+递归)相关推荐

  1. java系统排序_Java实现二进制排序树

    在计算机科学中,树是非常重要的数据结构二叉排序树是树的一种特殊情况二叉排序树是,它的每个节点只能有两个子节点,左子树的节点小于其父节点,右子树中的节点大于其父节点. 父节点二进制排序树在搜索中使用非常 ...

  2. POJ 1696 Space Ant(极角排序)【计算几何】

    ACM博客_kuangbin POJ 1696 Space Ant(极角排序) Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  3. 数据结构---二叉平衡排序树的删除

    数据结构-二叉平衡排序树的删除 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> typedef struct avlT ...

  4. poj 2528 Mayor's posters(线段树+离散化)

    1 /* 2 poj 2528 Mayor's posters 3 线段树 + 离散化 4 5 离散化的理解: 6 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用 ...

  5. POJ 1740 A New Stone Game(博弈)题解

    题意:有n个石子堆,每一个都可以轮流做如下操作:选一个石堆,移除至少1个石子,然后可以把这堆石子随便拿几次,随便放到任意的其他石子数不为0的石子堆,也可以不拿.不能操作败. 思路:我们先来证明,如果某 ...

  6. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  7. POJ 2152 fire / SCU 2977 fire(树型动态规划)

    POJ 2152 fire / SCU 2977 fire(树型动态规划) Description Country Z has N cities, which are numbered from 1 ...

  8. 树形图计算机系统组成,C数据结构的通用树结构和二进制排序树的基本操作

    二叉树: 二叉树是每个节点最多具有两个子树的树结构. 二叉树可以是一个空集:根可以有一个空的左或右子树:或左右子树都为空. 完整的二叉树: 高度为h且由2 {h} – 1个节点组成的二叉树称为完整的二 ...

  9. 二叉树排序树插入、创建、删除和查找

    二叉树排序树插入.创建.删除和查找 二叉排序树的概念 ​ 二叉排序树又称二叉查找树,它或者是一棵空树,或者是具有下列性质的二叉树 若它的左子树不为空,则左子树上所有结点的值均小于根结点的值 若它的右子 ...

最新文章

  1. GCLGP | 图卷积高斯过程
  2. java 配置微信js sdk_解析微信JS-SDK配置授权,实现分享接口
  3. python数组用sum求和_对python中array.sum(axis=?)的用法介绍
  4. m40型工业机器人_工业机器人在汽车生产中有的应用范围
  5. php document.getel,javascript 密码强弱度检测万能插件_javascript技巧
  6. 成都五月花计算机网教,【强调】成都五月花计算机学校网址是什么
  7. #把函数当作参数传给另一个函数
  8. c语言计算结果为1. inf0000,C语言复习题及答案老师给的
  9. Windows 使用windump进行循环抓包
  10. PAT (Basic Level) Practice1029 旧键盘
  11. python编程菜鸟_python菜鸟教程
  12. 计算机教育实习日志,计算机教师实习日志
  13. php越权执行命令漏洞_泛微OA系统多版本存在命令执行漏洞
  14. 计算机工作招聘要求高吗,太原高中计算机教师招聘
  15. 椭圆曲线加密中定义的加法运算
  16. 背阔肌(04):杠铃俯身划船
  17. 从普通程序员到估值上亿的公司老板,他只用了1年!
  18. 每步科技动态域名怎么用
  19. 微信oa服务器,企业号来了—你必须了解OA与微信结合的几种方式
  20. 仿酷安客户端的主题切换动画效果

热门文章

  1. python字典遍历 没有顺序_Python实现字典的遍历与排序功能示例
  2. modelandview为null的原因_一千个不用 Null 的理由!
  3. 易语言不用uac权限写到c盘,易语言制作UAC管理员模式添加器
  4. oracle 库not null,oracle平添not null约束
  5. HDU-2717-Catch That Cow(bfs)
  6. 二分法查找的java简单实现
  7. 手动升级 Confluence - 规划你的升级
  8. Spring Web Services 3.0.4.RELEASE和2.4.3.RELEASE发布
  9. 佛山高新区构建大数据产业新生态
  10. 作为搭建网站的程序员,你有Apsara Clouder云计算专项技能认证吗?