POJ1694 An Old Stone Game

/*
POJ1694 An Old Stone Game
仍未透彻理解其算法思想啊啊啊啊
题意:有一棵古老的树,树有各种叉,目标是在树根上放一个石头。
有k个石头在桶里面,每次将一个石头放到树叶上,对于每个节点,
只有子树上面所有的节点都放满了石头,才能在节点上放一个,
然后将子树上面的石头去掉,直到在根上放了石头,让求用最少的石子达到终点条件
思路:根的石头数是1,根的节点有n1,n2……nn的话,
那么就要先求节点需要的最少石子数,节点按照降序排列,
然后递归求解
DFS、贪心,但是还是理解的不透彻,心痛,毕竟不是自己想出来的啊
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>//qsort
using namespace std;
int Node[210][210];
int cmp(const void *a,const void *b)
{
    return *(int *)b-*(int *)a;
}
int Tree(int n)
{
    int maxn,i;
    int sum[210];
    if(Node[n][0]==0)
        return 1;

    for(i=1;i<=Node[n][0];i++)
        sum[i-1]=Tree(Node[n][i]);
    qsort(sum,Node[n][0],sizeof(int),cmp);//降序
    maxn=-1;
    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;
    cin>>m;
    while(m--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&t,&Node[i][0]);//根树的节点和子节点的个数
            for(int j=1;j<=Node[i][0];j++)
            {
                scanf("%d",&Node[i][j]);
            }
        }
        cout<<Tree(1)<<endl;
    }
    return 0;
}
这个题目要回来再写一遍啊
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值