华为od-获取最多食物

这是一个关于游戏地图设计的问题,参与者在N个方格中通过传送门寻找最多食物。每个方格有编号、父编号和食物值,参与者不能重复访问方格。问题求解参与者能获得的最大食物总量。给定示例输入和输出,说明了如何计算这一最大值。

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

1.1题目描述
主办方设计了一个获取食物的游戏。游戏的地图由N个方格组成,每个方格上至多2个传送门,通过传送门可将参与者传送至指定的其它方格。同时,每个方格上标注了三个数字: (1) 第一个数字id:代表方格的编号,从0到N-1,每个方格各不相同
(2)第二个数字parent-id:代表从编号为parent-id的方格可以通过传送门传送到当前方格(-1则表示没有任何方格可以通过传送门传送到此方格,这样的方格在地图中有且仅有一个);
(3)第三个数字value: 取值在[100,100]的整数值,正整数代表参与者得到相队取值单位的食物,负整数代表失去相应数值单位的食物(参与者可能存在临时持有食物为负数的情况),0则代表无变化。此外,地图设计时保证了参与者不可能到达相同的方格两次,并且至少有一个方格的value是正整数。游戏开始后,参与者任意选择一个方格作为出发点,当遇到下列情况之一退出游戏: (1)参与者当前所处的方格无传送门: (2) 参与者在任意方格上丰动宣布退出游戏 请计算参与者退出游戏后,最多可以获得多少单位的食物 解答要求 时间限制: C/C++ 1300ms.其他语言:2600ms内存限制: C/C++256MB其他语言:512MB 第一行:方块个数N (N<10000)

1.2输入示例
样例1输入:

7
0 1 8
1 -1 -2
2 1 9
4 0 -2
5 4 3
3 0 -3
6 2 -3

输出:

9

样例2:

3
0 -1 3
1 0 1
2 0 2

输出:

5

public static void findFood(){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[][] index = new int[n][3];
        for (int i = 0; i < n; i++) {
            index[i][0] = in.nextInt();
            index[i][1] = in.nextInt();
            index[i][2] = in.nextInt();
        }
        List<int[]> list = Arrays.asList(index);
        Collections.sort(list, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return  o1[0] - o2[0];
            }
        });
        int res = Integer.MIN_VALUE;
        for (int i = 0; i < n; i++) {
            int max = Integer.MIN_VALUE;
            int value = index[i][2];
            int parent = index[i][1];
            List<Integer> tmp = new ArrayList();
            tmp.add(value);
            while (parent != -1){
                value = index[parent][2];
                parent = index[parent][1];
                tmp.add(value);
            }
            int sum = 0;
            for (int j = 0; j < tmp.size(); j++) {
                sum += tmp.get(j);
                max = Math.max(max,sum);
            }
            res = Math.max(res,max);
        }
        System.out.println(res);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值