徒步旅行中的补给问题

ops/2024/11/25 23:40:08/

徒步旅行中的补给问题

在这里插入图片描述

队列

    public static int solution(int n, int k, int[] data) {int minMoney = 0;Queue<Integer> ready = new LinkedList<>();int minValue;for (int i = 0; i < n; i++) {// 当前站点加入readyready.add(data[i]);// 如果ready大于k,就将最先进入的站点价格删除if (ready.size() > k) {ready.poll();}// 找到最小值,时间复杂度为O(k)minValue = findMin(ready);minMoney += minValue;}return minMoney;}// 找到队列中的最小值private static int findMin(Queue<Integer> queue) {int min = Integer.MAX_VALUE;for (int value : queue) {min = Math.min(min, value);}return min;}

优化
可以使用 单调队列(Monotonic Queue) 来优化找到窗口最小值的部分:

单调队列维护窗口内的元素顺序,使得队列的最前端始终是窗口的最小值。
每次加入新元素时,将比它大的队列元素移除,保持队列单调递增。

单调队列

import java.util.Deque;
import java.util.LinkedList;public class Main {public static int solution(int n, int k, int[] data) {int minMoney = 0;// 单调队列,用于存储当前窗口的索引,队列中存储的数据是单调递增的Deque<Integer> deque = new LinkedList<>();for (int i = 0; i < n; i++) {// 如果队列首部的索引不在窗口范围内,移除它if (!deque.isEmpty() && deque.peekFirst() < i - k + 1) {deque.pollFirst();}// 从队列尾部移除所有比当前元素大的值// 这样可以保证队列中元素的单调性(从小到大)while (!deque.isEmpty() && data[deque.peekLast()] > data[i]) {deque.pollLast();}// 将当前索引加入队列deque.offerLast(i);// 累加当前窗口的最小值(队列首部存储的是最小值的索引)minMoney += data[deque.peekFirst()];}return minMoney;}public static void main(String[] args) {// Add your test cases hereSystem.out.println(solution(5, 2, new int[] { 1, 2, 3, 3, 2 }) == 9);}
}

ps:代码都是GPT给出的,自己尝试用贪心总是有点问题


http://www.ppmy.cn/ops/136700.html

相关文章

Flutter:SlideTransition位移动画,Interval动画延迟

配置vsync&#xff0c;需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// 定义 AnimationControllerlate AnimationController _controller;overridevoid initState() {super.…

在使用PCA算法进行数据压缩降维时,如何确定最佳维度是一个关键问题?

一、PCA算法的基本原理 PCA算法的核心思想是通过正交变换&#xff0c;将一组可能相关的变量转换成一组线性不相关的变量&#xff0c;称为主成分。这组主成分能够以最小的信息损失来尽可能多地保留原始数据集的变异性。具体来说&#xff0c;PCA算法包括以下几个步骤&#xff1a…

Unity 设计模式-原型模式(Prototype Pattern)详解

原型模式 (Prototype Pattern) 原型模式 (Prototype Pattern) 是一种创建型设计模式&#xff0c;它允许通过复制现有的对象来创建新对象&#xff0c;而不是通过直接实例化类。这意味着你可以通过克隆原型对象来生成新的实例&#xff0c;而不必依赖类的构造函数。该模式的核心思…

【青牛科技】 GC1288散热风扇驱动芯片的理想替代者可替代LA6588 / 三洋

在散热风扇驱动芯片领域&#xff0c;芯麦 GC1288 作为 LA6588 / 三洋芯片的替代佳品&#xff0c;为散热风扇带来了卓越性能。 一、GC1288 的特点 高效能控制&#xff1a;支持高频 PWM 调制&#xff0c;可实现更精确的风扇转速控制&#xff0c;确保不同负载下散热效率最大化。…

卡达掐发展史

自行车是一种简单而又伟大的交通工具。自从19世纪诞生以来&#xff0c;它不仅改变了人们的出行方式&#xff0c;也深刻地影响了我们的生活方式、城市布局以及健康观念。作为一种绿色、经济的出行工具&#xff0c;自行车至今仍在全球范围内被广泛使用。本文将从自行车的历史、结…

Elasticsearch面试内容整理-安全与权限管理

在 Elasticsearch 中,安全与权限管理至关重要,特别是当系统处理敏感数据时。Elasticsearch 提供了一套全面的安全机制来确保数据的机密性、完整性和可用性。以下是 Elasticsearch 安全与权限管理的详细介绍。 安全组件概述 Elasticsearch 的安全功能由 Elastic Stack 提供的一…

QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现

一、编码问题 在计算机编程中&#xff0c;流&#xff08;Stream&#xff09;是一种抽象的概念&#xff0c;用于表示数据的输入或输出。根据处理数据的不同方式&#xff0c;流可以分为字节流&#xff08;Byte Stream&#xff09;和字符流&#xff08;Character Stream&#xff0…

蓝桥杯某C语言算法题解决方案(质因数分解)

蓝桥杯原题&#xff1a;将一个正整数分解质因数例如&#xff1a;输入90&#xff0c;打印出90 2 * 3 * 3 * 5。 声明&#xff1a;该题目是否为蓝桥杯原题未知&#xff0c;我是从CSDN上面查到的&#xff0c;仅对该题目进行解决。 这个题与我之前发表过的一些关于检验一个数字是…