1 条题解

  • 1
    @ 2025-3-31 21:05:40

    题意

    有一棵古老的树,树有各种叉,目标是在树根上放一个石头。 有kk个石头在桶里面,每次将一个石头放到树叶上,对于每个节点, 只有子树上面所有的节点都放满了石头,才能在节点上放一个, 然后将子树上面的石头去掉,直到在根上放了石头,让求用最少的石子达到终点条件

    思路

    根的石头数是11,根的节点有n1n2nnn1,n2……nn的话, 那么就要先求节点需要的最少石子数,节点按照降序排列, 然后递归求解

    标程

    #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
    上传者