1 条题解
-
1
题意
有一棵古老的树,树有各种叉,目标是在树根上放一个石头。 有个石头在桶里面,每次将一个石头放到树叶上,对于每个节点, 只有子树上面所有的节点都放满了石头,才能在节点上放一个, 然后将子树上面的石头去掉,直到在根上放了石头,让求用最少的石子达到终点条件
思路
根的石头数是,根的节点有的话, 那么就要先求节点需要的最少石子数,节点按照降序排列, 然后递归求解
标程
#include <cstdio> #include <iostream> #include <cstring> #include <cstdlib> using namespace std; // 定义比较函数用于降序排序 int cmp(const void *a, const void *b) { return *(int *)b - *(int *)a; } // 树节点存储结构 int Node[210][210]; // 递归计算当前节点所需最小石头数 int Tree(int n) { int maxn = -1; int i; if (Node[n][0] == 0) { return 1; } int sum[210]; for (i = 1; i <= Node[n][0]; i++) { sum[i - 1] = Tree(Node[n][i]); } // 使用 C 风格排序函数 qsort(sum, Node[n][0], sizeof(int), cmp); for (i = 0; i < Node[n][0]; i++) { if (sum[i] + i > maxn) { maxn = sum[i] + i; } } return maxn; } int main() { int m, n, t; int i, j; cin >> m; while (m--) { cin >> n; for (i = 1; i <= n; i++) { scanf("%d%d", &t, &Node[i][0]); for (j = 1; j <= Node[i][0]; j++) { scanf("%d", &Node[i][j]); } } cout << Tree(1) << endl; } return 0; }
- 1
信息
- ID
- 695
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者