牛客冬季训练营2,Tokitsukaze and Energy Tree

文章描述了一个关于能量树的问题,其中Tokitsukaze需要将n个能量球分配到n个节点上,以最大化获取的能量。通过计算每个节点的父节点数量并进行排序,然后匹配最大能量球,可以实现最大能量总和。程序实现了这一策略并输出了结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

Tokitsukaze 有 nnn 个节点的有根能量树,根为 111。最开始,树上每个节点的能量都是 000。

现在 Tokitsukaze 有 nnn 个能量球,第 iii 个能量球拥有 viv_ivi​ 能量。她想把这 nnn 个能量球分别放置在能量树的每个节点上,使能量树的每个节点都恰好有一个能量球。

Tokitsukaze 每次只能放置一个能量球,所以她将进行 nnn 次操作。每一次操作,她会选择一个能量球,再选择一个没有能量球的能量树节点 xxx,把刚刚选择的能量球放置在节点 xxx 上。在这之后,Tokitsukaze 能获得以 xxx 为根的子树中的所有能量球的能量 (包括节点 xxx 的能量球能量)。

在放置完所有能量球后,Tokitsukaze 可能获得的总能量最多是多少?


 

输入描述:

 

 

import java.util.*;
import java.io.*;

public class Main{
    public static void main(String[] args) {
        /*每个节点的父类节点加上自己就是使用的次数
        进行排序使用次数最多的用最大的能量球
        */
        Scanner in=new Scanner(System.in);
        while(in.hasNext()) {
            int a=in.nextInt();
            long w[]=new long[a+1];//储存能量球
            long sz[]=new long[a+1];//储存每个节点连自己有多少父节点和祖宗节点
            sz[1]=1;//初始自己一个节点
            for(int x=2;x<=a;x++) {
                long b=in.nextInt();
                sz[x]=sz[(int)b]+1;//算每个节点的父节点和祖宗节点个数
                //例如2的父节点是1在加上自身为二
            }
            for(int x=1;x<=a;x++) {
                w[x]=in.nextLong();
            }
            long sum=0;
            Arrays.sort(sz,1,a+1);
            Arrays.sort(w,1,a+1);
            for(int x=1;x<=a;x++) {
                sum+=sz[x]*w[x];
            }
            System.out.println(sum);
        }
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坚持写博客的小行星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值