首页 > 其他分享 >华为OD刷题C卷 - 每日刷题32(执行任务赚积分,计算三叉搜索树的高度)

华为OD刷题C卷 - 每日刷题32(执行任务赚积分,计算三叉搜索树的高度)

时间:2024-06-16 12:03:47浏览次数:13  
标签:cur int 32 OD 任务 score 积分 节点 刷题

1、(执行任务赚积分):

这段代码是解决“执行任务赚积分”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,用于计算在有限的时间内,处理任务可以获得的最多积分。

main方法首先读取任务数量n和可用于处理任务的时间t,然后读取每个任务的最晚处理时间限制和积分值,存储在二维数组wos中。接着,调用getResult方法并打印出可获得的最多积分。

getResult方法首先按任务的最晚处理时间对任务进行升序排序。接着,使用一个ArrayList来维护在当前时间curTime内可以获得的积分列表。遍历所有任务,如果当前时间小于任务的最晚处理时间,则将任务积分添加到列表中,并更新当前时间。如果当前时间已经过了任务的最晚处理时间,则使用列表中的最小积分与当前任务积分进行比较,保留积分较高的任务。

最后,对列表进行排序并只保留最大的t个积分值,计算并返回这些积分值的总和。

2、(计算三叉搜索树的高度):

这段代码是解决“计算三叉搜索树的高度”的问题。它提供了一个Java类Main,其中包含main方法,以及两个内部类TreeNode和Tree,用于构建三叉搜索树并计算树的高度。

main方法首先读取要插入的数的数量n,然后读取这些数,使用Tree类的add方法将它们按规则插入三叉搜索树中。最后,打印出树的高度。

TreeNode内部类表示树的节点,包含节点值、高度以及指向左右中子树的引用。

Tree内部类包含根节点和树的高度。add方法实现了将新数按照给定规则插入三叉搜索树的逻辑。在插入过程中,同时更新节点的高度和树的当前最大高度。

package OD359;

import com.sun.source.tree.Tree;

import java.util.*;

/**
 * @description 执行任务赚积分
 * @level 7
 * @score 100
 */

/**
 * 题目描述
 * 现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为1。
 * <p>
 * 每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。
 * <p>
 * 可用于处理任务的时间有限,请问在有限的时间内,可获得的最多积分。
 * <p>
 * 输入描述
 * 第一行为一个数 N,表示有 N 个任务
 * <p>
 * 1 ≤ N ≤ 100
 * 第二行为一个数 T,表示可用于处理任务的时间
 * <p>
 * 1 ≤ T ≤ 100
 * 接下来 N 行,每行两个空格分隔的整数(SLA 和 V),SLA 表示任务的最晚处理时间,V 表示任务对应的积分。
 * <p>
 * 1 ≤ SLA ≤ 100
 * 0 ≤ V ≤ 100000
 * 输出描述
 * 可获得的最多积分
 */
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //有n个任务
        int n = sc.nextInt();
        //用于处理任务的时间
        int t = sc.nextInt();
        //n个任务的 最晚处理时间 对应积分
        int[][] wos = new int[n][2];
        for (int i = 0; i < n; i++) {
            wos[i][0] = sc.nextInt();
            wos[i][1] = sc.nextInt();
        }

        //可获得的最多积分
        System.out.println(getResult(t, wos));

    }

    //再t时间内可获得的最多积分
    public static int getResult(int t, int[][] wos) {
        //按endTime升序排序
        Arrays.sort(wos, (a, b) -> a[0] - b[0]);
        //已获得的积分
        int value = 0;
        //当前时间
        int curTime = 0;
        //存放可能获得的积分
        ArrayList<Integer> list = new ArrayList<>();
        //遍历
        for (int[] wo : wos) {
            int endTime = wo[0];
            int score = wo[1];
            //当curTime<endTime 时,加入
            if (curTime < endTime) {
                list.add(score);
                value += score;
                curTime++;
            } else {
                //当curTime >= endTime时,用list总最小值与当前score比较,放入较大值
                //总是能存放最大的几个值
                list.sort((a, b) -> a - b);
                int min_score = list.get(0);
                if (score > min_score) {
                    list.remove(0);
                    list.add(score);
                    value += score - min_score;
                }
            }
        }
        //升序排列
        list.sort((a, b) -> a - b);
        //只保留最大的t个值
        while (list.size() > t) {
            value -= list.remove(0);
        }
        return value;

    }


}
package OD360;

import java.util.Scanner;

/**
 * @description 计算三叉搜索树的高度
 * @level 4
 * @score 100
 */
/**
 * 题目描述
 * 定义构造三叉搜索树规则如下:
 * <p>
 * 每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入。查找的规则是:
 * <p>
 * 如果数小于节点的数减去500,则将数插入节点的左子树
 * 如果数大于节点的数加上500,则将数插入节点的右子树
 * 否则,将数插入节点的中子树
 * 给你一系列数,请按以上规则,按顺序将数插入树中,构建出一棵三叉搜索树,最后输出树的高度。
 * <p>
 * 输入描述
 * 第一行为一个数 N,表示有 N 个数,1 ≤ N ≤ 10000
 * <p>
 * 第二行为 N 个空格分隔的整数,每个数的范围为[1,10000]
 * <p>
 * 输出描述
 * 输出树的高度(根节点的高度为1)
 */
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //可能有多行输入try-catch
        int n = sc.nextInt();
        Tree tree = new Tree();
        for (int i = 0; i < n; i++) {
            int val = sc.nextInt();
            tree.add(val);
        }
        System.out.println(tree.tree_height);
    }

    //定义树节点
    static class TreeNode {
        int val;//节点值
        int height;//节点高度
        TreeNode left;//左子树
        TreeNode mid;//中子树
        TreeNode right;//右子树

        //赋值构造方法
        public TreeNode(int val) {
            this.val = val;
        }
    }

    //定义三叉树 和添加节点的逻辑
    static class Tree {
        //根节点
        TreeNode root;
        //数的高度
        int tree_height;

        //add方法
        public void add(int val) {
            TreeNode node = new TreeNode(val);
            //如果没有根节点
            if (this.root == null) {
                node.height = 1;//根节点高度为1
                this.root = node;//temp定为root节点
                this.tree_height = 1;//目前数的高度为1
            } else {
                //已存在根节点,则用temp从根节点去逐层比较
                TreeNode cur = this.root;
                while (true) {
                    //假设temp是当前cur节点的子节点
                    node.height = cur.height + 1;
                    //更新树的高度
                    this.tree_height = Math.max(this.tree_height, node.height);
                    //如果小于当前节点的数-500,则插入到cur的左子树
                    if (val < cur.val - 500) {
                        //如果没有左子树,则新建左子树,如果有,则更新cur=cur.left
                        if (cur.left == null) {
                            cur.left = node;
                            //插入后就跳出
                            break;
                        } else {
                            //否则回到while继续搜索
                            cur = cur.left;
                        }
                    } else if (val > cur.val + 500) {
                        //插入右子树
                        if (cur.right == null) {
                            cur.right = node;
                            break;
                        } else {
                            cur = cur.right;
                        }
                    } else {
                        //插入中子树
                        if (cur.mid == null) {
                            cur.mid = node;
                            break;
                        } else {
                            cur = cur.mid;
                        }
                    }
                }
            }
        }
    }
}

标签:cur,int,32,OD,任务,score,积分,节点,刷题
From: https://blog.csdn.net/2401_84585615/article/details/139596068

相关文章

  • 华为OD刷题C卷 - 每日刷题31(园区参观路径,围棋的气)
    1、(园区参观路径):这段代码是解决“园区参观路径”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,以及一个未使用的dfs方法,用于计算从园区起点到终点的不同参观路径数量。main方法首先读取园区的长和宽,然后读取园区的布局信息,其中0表示可以参观,1表示不能参......
  • 华为OD刷题C卷 - 每日刷题30(小明找位置,分隔均衡字符串)
    1、(小明找位置):这段代码是解决“小明找位置”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,用于帮助小明快速找到他在排队中应该站的位置。main方法首先读取已排列好的小朋友的学号数组和小明的学号,然后调用getResult方法并打印小明应该站的位置。getRe......
  • Android Media Framework(五)Tunnel Mode
    本篇将聚焦AndroidTunnelMode,详细解析组件之间隧道连接过程、数据传递过程、组件销毁过程。通过阅读本篇内容,我们应能对tunneled组件的连接过程和buffer分配过程有所了解。1、TunnelMode介绍ILSpec详细描述了TunnelComponent的实现方式,但内容较为晦涩难懂,网上相关......
  • 华为余承东:全场景代码智能生成工具CodeArts snap正式发布,码力遥遥领先
    野心让人勤奋节制让人枯萎   前几天的端午节,华为发布了新一代代码智能生成工具codeartssnap。可以一键生成高效代码,精准解决技术难题,让你像技术大牛一样轻松完成业务开发。  下面来看看它是如何码力全开的。 第一个,通过注释一键生成代码如下,当你写好代码的注......
  • 【LeetCode最详尽解答】11-盛最多水的容器 Container-With-Most-Water
    欢迎收藏Star我的MachineLearningBlog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star,有问题可以随时与我交流,谢谢大家!链接:11-盛最多水的容器直觉这个问题可以通过可视化图表来理解和解决。通过图形化这个问题,可以简化解决过程。......
  • 【LeetCode最详尽解答】15-三数之和 3sum
    欢迎收藏Star我的MachineLearningBlog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star,有问题可以随时与我交流,谢谢大家!链接:15-三数之和直觉示例:输入:nums=[-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]解释:nums[......
  • 【TensorFlow深度学习】使用Horovod加速TensorFlow分布式训练
    使用Horovod加速TensorFlow分布式训练使用Horovod加速TensorFlow分布式训练:并行计算的高效实践Horovod简介安装与环境准备示例代码结构性能优化建议结语使用Horovod加速TensorFlow分布式训练:并行计算的高效实践在深度学习领域,随着模型复杂度的日益增加,单机训练已......
  • Nature Methods | 二倍体基因组组装工具hypo-assembler
    近日,Wing-KinSung(宋永健)博士在NatureMethods发文CreatingdiploidassembliesfromNanoporeandIlluminareadswithhypo-assembler,报道其开发的基因组组装新工具hypo-assembler,该工具可以利用Nanopore和Illuminareads将二倍体基因组组装成两套单倍型。关于KinSung:作为......
  • 打卡信奥刷题(90)用Scratch图形化工具信奥P1853 [普及组] 投资的最大效益
    投资的最大效益题目背景约翰先生获得了一大笔遗产,他暂时还用不上这一笔钱,他决定进行投资以获得更大的效益。银行工作人员向他提供了多种债券,每一种债券都能在固定的投资后,提供稳定的年利息。当然,每一种债券的投资额是不同的,一般来说,投资越大,收益也越大,而且,每一年还可以根......
  • Dynamsoft.DotNet.BarcodeReader.Bundle-10.2.1100
    DynamsoftBarcodeReaderSDK.NetEditionDynamsoftBarcodeReaderSDKenablesyoutoefficientlyembedbarcodereadingfunctionalityinyourweb,desktopormobileapplicationusingjustafewlinesofcode.Savingyoumonthsofaddeddevelopmenttime......