OD_2024_C卷_200分_8、攀登者2【JAVA】【逻辑分析】

news/2024/5/19 7:37:02 标签: java, 开发语言, OD

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

java">package odjava;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;

public class 八_攀登者2 {
    // 输入处理
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int[] heights = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
        int strength = Integer.parseInt(sc.nextLine());

        System.out.println(getResult(heights, strength));
    }

    // 算法实现(本题实际考试为核心代码模式,因此考试时只需要写出此函数实现即可)
    public static int getResult(int[] heights, int strength) {
        // 记录可攀登的山峰索引
        HashSet<Integer> idxs = new HashSet<>();

        // 正向攀登
        climb(heights, strength, idxs, true);

        // 逆序攀登
        reverse(heights);
        climb(heights, strength, idxs, false);

        return idxs.size();
    }

    public static void climb(int[] heights, int strength, HashSet<Integer> idxs, boolean direction) {
        // 找到第一个地面位置
        int j = 0;
        while (j < heights.length && heights[j] != 0) {
            j++;
        }

        int cost = 0; // 攀登体力总消耗(包括上山,下山)
        //    int upCost = 0; // 上山体力消耗
        //    int downCost = 0; // 下山体力消耗

        // 开始攀登
        for (int i = j + 1; i < heights.length; i++) {
            // 如果遇到了新的地面,则从新的地面位置重新计算攀登消耗的体力
            if (heights[i] == 0) {
                cost = 0;
                //        upCost = 0;
                //        downCost = 0;
                continue;
            }

            int diff = heights[i] - heights[i - 1]; // diff记录高度差

            if (diff > 0) {
                // 如果过程是上坡
                cost += diff * 3;
                //        upCost += diff * 2; // 则上山时,体力消耗 = 高度差 * 2
                //        downCost += diff; // 相反的下山时,体力消耗 = 高度差 * 1

                // 由于 height[i] > heights[i-1],因此如果 height[i] > heights[i+1] 的话,位置 i 就是山顶
                if (i + 1 >= heights.length || heights[i] > heights[i + 1]) {
                    // 计算攀登此山顶的上山下山消耗的体力和
                    if (cost < strength) {
                        //          if (upCost + downCost <= strength) {
                        // 如果小于自身体力,则可以攀登
                        if (direction) {
                            idxs.add(i);
                        } else {
                            idxs.add(heights.length - i - 1); // 需要注意,逆序heights数组后,我们对于的山峰位置需要反转
                        }
                    }
                }

            } else if (diff < 0) {
                // 如果过程是下坡
                cost -= diff * 3;
                //        upCost -= diff; // 则上山时,体力消耗 = 高度差 * 1
                //        downCost -= diff * 2; // 相反的下山时,体力消耗 = 高度差 * 2

                // heights[i] < heights[i-1],因此位置i不可能是山顶
            }
        }
    }

    public static void reverse(int[] nums) {
        int i = 0;
        int j = nums.length - 1;

        while (i < j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
            i++;
            j--;
        }
    }
}


http://www.niftyadmin.cn/n/5420780.html

相关文章

《opencv实用探索·二十三》支持向量机SVM处理线性不可分数据

1、概述 在上一章我们详细讲解了支持向量机SVM处理线性可分数据&#xff0c;有需要的可以看《opencv实用探索二十二》支持向量机SVM用法 在讲解支持向量机SVM处理线性不可分数据之前我们还是再次回顾下什么叫线性可分和线性不可分。以二维平面为例&#xff0c;如果在这个二维平…

Python 二分分治解法: Leetcode 56- 合并区间

题目 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;intervals …

Python炒股自动化(4):通过接口向交易所发送订单

实现股票的程序化自动化交易&#xff0c;可以简单分为三步&#xff0c;获取数据、提交订单、查询交易账户&#xff0c;前面讲了如何获取历史数据和实时数据&#xff0c;今天我们讲一下提交订单。 程序交易中取数据有很多方法和渠道可以取到&#xff0c;重点是交易&#xff0c;也…

【数据库概论】图数据库 Vs 关系数据库(1)

例子1&#xff1a;社交网络 假设有一个社交网络需要用数据库存储&#xff0c;其中人与人之间的关系有&#xff1a;朋友&#xff08;friend&#xff09;、父母&#xff08;parent&#xff09; 首先用关系数据库来实现朋友关系&#xff0c;需要 3 张表&#xff1a;people、peop…

虾皮Shopee商品详情数据采集,item_get-根据ID取商品详情

Shopee&#xff08;虾皮&#xff09;是一个流行的东南亚电商平台&#xff0c;许多商家和开发者都对其商品详情数据感兴趣。为了采集Shopee上的商品详情数据&#xff0c;特别是根据商品ID获取商品详情&#xff0c;通常需要使用Shopee提供的API接口或者通过爬虫技术。然而&#x…

突破编程_C++_字符串算法(找到字符串中最长的公共前缀)

1 算法题 &#xff1a;找到字符串中最长的公共前缀 1.1 题目含义 找到字符串中最长的公共前缀是一个常见的字符串处理问题。给定一个字符串数组&#xff0c;需要找到数组中所有字符串的最长公共前缀。最长公共前缀是指所有给定字符串共同拥有的前缀子串&#xff0c;并且这个子…

机器学习-04-分类算法-01决策树案例

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中分类算法&#xff0c;本篇为分类算法开篇与决策树部分。 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程…

Spring AOP 原理

&#x1f496; AOP 介绍 AOP&#xff0c;也就是 Aspect-oriented Programming&#xff0c;译为面向切面编程。 简单点说&#xff0c;就是把一些业务逻辑中的相同代码抽取到一个独立的模块中&#xff0c;让业务逻辑更加清爽。 举个例子&#xff0c;假如我们现在需要在业务代码…