2023.04.12-华子实习笔试-第二题-获取最多食物

内容相似,原题可参考codefunP1190

直接先上代码。。。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static List<List<Integer>> pp = new ArrayList<>();
    public static int[] values;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        values = new int[n];
        for (int i = 0; i < n; i++) {
            pp.add(new ArrayList<>());
        }
        for (int i = 0; i < n; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            int val = sc.nextInt();
            if(b!=-1){
                pp.get(b).add(a);
            }
            values[a] = val;
        }
        List<Integer> vs = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            dfs(i,0,vs);
        }
        int maxV=Integer.MIN_VALUE;
        for (Integer v : vs) {
            maxV = Math.max(maxV, v);
        }
        System.out.println(maxV);


    }

    public static void dfs( int cur, int curV, List<Integer> vs){
        if(pp.get(cur).size()==0){
            curV+=values[cur];
            vs.add(curV);
            return;
        }
        curV+=values[cur];
        vs.add(curV);
        for (int i = 0; i < pp.get(cur).size(); i++) {
            dfs(pp.get(cur).get(i),curV,vs);
        }
    }
}

代码写的很基础,自己理解的在codefun上面能AC。

首先,按照题意,第二个数是传送门的父亲结点,第一个数才是本节点,用List来存储各个结点的下一个结点,例如样例中的0的list中包括4,3,用数组values记录每个结点的食物数量;思路就是深度遍历(DFS),以每个结点为头,去遍历到达每个位置中止的食物量,并将此种情况下的数量加入list。完成后取个list中的最大值即可。

DFS的思路就是,cur表示目前访问的结点,curV表示到达这个节点前我已经获得的食物量,遇到出度为0的结点或者就是当前节点都将食物量加入list,然后对其下一个节点也做DFS,可得出答案。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值