【1599. 经营摩天轮的最大利润】

news2024/10/7 6:49:08

来源:力扣(LeetCode)

描述:

你正在经营一座摩天轮,该摩天轮共有 4 个座舱 ,每个座舱 最多可以容纳 4 位游客 。你可以 逆时针 轮转座舱,但每次轮转都需要支付一定的运行成本 runningCost 。摩天轮每次轮转都恰好转动 1 / 4 周。

给你一个长度为 n 的数组 customerscustomers[i] 是在第 i 次轮转(下标从 0 开始)之前到达的新游客的数量。这也意味着你必须在新游客到来前轮转 i 次。每位游客在登上离地面最近的座舱前都会支付登舱成本 boardingCost ,一旦该座舱再次抵达地面,他们就会离开座舱结束游玩。

你可以随时停下摩天轮,即便是 在服务所有游客之前 。如果你决定停止运营摩天轮,为了保证所有游客安全着陆,将免费进行所有后续轮转 。注意,如果有超过 4 位游客在等摩天轮,那么只有 4 位游客可以登上摩天轮,其余的需要等待 下一次轮转

返回最大化利润所需执行的 最小轮转次数 。 如果不存在利润为正的方案,则返回 -1

示例 1:

1

输入:customers = [8,3], boardingCost = 5, runningCost = 6
输出:3
解释:座舱上标注的数字是该座舱的当前游客数。
1. 8 位游客抵达,4 位登舱,4 位等待下一舱,摩天轮轮转。当前利润为 4 * $5 - 1 * $6 = $142. 3 位游客抵达,4 位在等待的游客登舱,其他 3 位等待,摩天轮轮转。当前利润为 8 * $5 - 2 * $6 = $283. 最后 3 位游客登舱,摩天轮轮转。当前利润为 11 * $5 - 3 * $6 = $37 。
轮转 3 次得到最大利润,最大利润为 $37

示例 2:

输入:customers = [10,9,6], boardingCost = 6, runningCost = 4
输出:7
解释:
1. 10 位游客抵达,4 位登舱,6 位等待下一舱,摩天轮轮转。当前利润为 4 * $6 - 1 * $4 = $202. 9 位游客抵达,4 位登舱,11 位等待(2 位是先前就在等待的,9 位新加入等待的),摩天轮轮转。当前利润为 8 * $6 - 2 * $4 = $403. 最后 6 位游客抵达,4 位登舱,13 位等待,摩天轮轮转。当前利润为 12 * $6 - 3 * $4 = $604. 4 位登舱,9 位等待,摩天轮轮转。当前利润为 * $6 - 4 * $4 = $805. 4 位登舱,5 位等待,摩天轮轮转。当前利润为 20 * $6 - 5 * $4 = $1006. 4 位登舱,1 位等待,摩天轮轮转。当前利润为 24 * $6 - 6 * $4 = $1207. 1 位登舱,摩天轮轮转。当前利润为 25 * $6 - 7 * $4 = $122 。
轮转 7 次得到最大利润,最大利润为$122

示例 3:

输入:customers = [3,4,0,5,1], boardingCost = 1, runningCost = 92
输出:-1
解释:
1. 3 位游客抵达,3 位登舱,0 位等待,摩天轮轮转。当前利润为 3 * $1 - 1 * $92 = -$892. 4 位游客抵达,4 位登舱,0 位等待,摩天轮轮转。当前利润为 is 7 * $1 - 2 * $92 = -$1773. 0 位游客抵达,0 位登舱,0 位等待,摩天轮轮转。当前利润为 7 * $1 - 3 * $92 = -$2694. 5 位游客抵达,4 位登舱,1 位等待,摩天轮轮转。当前利润为 12 * $1 - 4 * $92 = -$3565. 1 位游客抵达,2 位登舱,0 位等待,摩天轮轮转。当前利润为 13 * $1 - 5 * $92 = -$447 。
利润永不为正,所以返回 -1

提示:

  • n == customers.length
  • 1 <= n <= 105
  • 0 <= customers[i] <= 50
  • 1 <= boardingCost, runningCost <= 100

方法:模拟

假设每位游客需要支付的费用是 boardingCost,一次轮转有 curCustomers 位游客登上座舱,每次轮转的运行成本是 runningCost,则摩天轮当前一次轮转的利润是 boardingCost × curCustomers − runningCost,其中boardingCost 和 runningCost 的值是已知的,curCustomers 的值由正在等摩天轮的游客的数量和座舱可以容纳的游客的数量中的最小值决定,其中座舱可以容纳的游客的数量为 4。

对于长度为 n 的数组 customers,customers[i] 是在第 i 次轮转之前到达的新游客的数量(i 从 0 开始),因此可以根据到达的新游客的数量和登上摩天轮的游客的数量计算每一次轮转时正在等摩天轮的游客的数量。

轮转摩天轮分成两个阶段。第一阶段是前 n 次轮转,每次轮转之前都可能有新游客到达。如果在第一阶段结束之后还有剩余的游客在等摩天轮,则进入第二阶段,将剩余的游客轮转完毕。

对于第一阶段的每次轮转,需要首先计算该次轮转时正在等摩天轮的游客的数量,然后计算该次轮转的利润以及总利润,同时维护最大利润与最大利润的最小轮转次数。具体而言,第 i 次轮转的流程如下:

  1. 使用 customers[i] 的值更新正在等摩天轮的游客的数量;
  2. 计算登上座舱的游客的数量,为正在等摩天轮的游客的数量和座舱可以容纳的游客的数量的最小值;
  3. 将登上座舱的游客的数量从正在等摩天轮的游客的数量中减去;
  4. 计算该次轮转的利润,并计算到该次轮转的总利润;
  5. 如果总利润大于最大利润,则更新最大利润与最大利润的最小轮转次数。

第一阶段结束后,如果没有剩余的游客在等摩天轮,则直接返回最大利润的最小轮转次数。如果还有剩余的游客在等摩天轮,只有当剩余的游客带来的利润为正时,才需要考虑第二阶段,可能获得更多的利润。

由于每位游客需要支付的费用是正数,因此当座舱满舱时(即座舱上有 4 位游客,达到最大容纳数量),可以达到一次轮转的最大利润。如果一次轮转的最大利润不为正,则第二阶段的利润一定不为正,因此直接返回第一阶段的最大利润的最小轮转次数。

如果一次轮转的最大利润为正,则每次座舱满舱的轮转的利润都为正,因此计算全部满舱轮转之后的总利润,如果大于最大利润则更新最大利润与最大利润的最小轮转次数。最后可能剩下少于 4 位游客,需要进行最后一次非满舱的轮转,在最后一次轮转之后计算总利润,如果总利润大于最大利润则更新最大利润与最大利润的最小轮转次数。

代码:

class Solution {
public:
    int minOperationsMaxProfit(vector<int>& customers, int boardingCost, int runningCost) {
        int ans = -1;
        int maxProfit = 0;
        int totalProfit = 0;
        int operations = 0;
        int customersCount = 0;
        int n = customers.size();
        for (int i = 0; i < n; i++) {
            operations++;
            customersCount += customers[i];
            int curCustomers = min(customersCount, 4);
            customersCount -= curCustomers;
            totalProfit += boardingCost * curCustomers - runningCost;
            if (totalProfit > maxProfit) {
                maxProfit = totalProfit;
                ans = operations;
            }
        }
        if (customersCount == 0) {
            return ans;
        }
        int profitEachTime = boardingCost * 4 - runningCost;
        if (profitEachTime <= 0) {
            return ans;
        }
        if (customersCount > 0) {
            int fullTimes = customersCount / 4;
            totalProfit += profitEachTime * fullTimes;
            operations += fullTimes;
            if (totalProfit > maxProfit) {
                maxProfit = totalProfit;
                ans = operations;
            }
            int remainingCustomers = customersCount % 4;
            int remainingProfit = boardingCost * remainingCustomers - runningCost;
            totalProfit += remainingProfit;
            if (totalProfit > maxProfit) {
                maxProfit = totalProfit;
                operations++;
                ans++;
            }
        }
        return ans;
    }
};

执行用时:76 ms, 在所有 C++ 提交中击败了96.77%的用户
内存消耗:79.4 MB, 在所有 C++ 提交中击败了93.55%的用户
复杂度分析
时间复杂度:O(n),其中 n 是数组 customers 的长度。遍历数组一次计算第一阶段的最大利润与最小轮转次数,时间复杂度是 O(n),第二阶段的最大利润与最小轮转次数的计算的时间复杂度是 O(1)。
空间复杂度:O(1)。只需要维护常量的额外空间。
author:LeetCode-Solution

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/389563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于flask+bootstrap+echarts+mysql的鱼村小馆订餐后台管理系统

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

[1.3.3]计算机系统概述——系统调用

文章目录第一章 计算机系统概述系统调用&#xff08;一&#xff09;什么是系统调用&#xff0c;有何作用&#xff08;二&#xff09;系统调用与库函数的区别&#xff08;三&#xff09;小例子&#xff1a;为什么系统调用是必须的&#xff08;四&#xff09;什么功能要用到系统调…

English Learning - L2-4 英音地道语音语调 双元音 [eɪ] [aɪ] [aʊ] [əʊ] [ɔɪ] 2023.03.2 周四

English Learning - L2-4 英音地道语音语调 双元音 [eɪ] [aɪ] [aʊ] [əʊ] [ɔɪ] 2023.03.2 周四节奏发音对比双元音概述双元音 [eɪ]发音技巧对应单词的发音对应句子的发音双元音 [aɪ]发音技巧对应单词的发音对应句子的发音双元音 [aʊ]发音技巧对应单词的发音对应句子的…

Android kotlin 系列讲解(进阶篇)高级项目架构模式 - MVVM

<<返回总目录 1、MVVM是什么 MVVM是Model-View-ViewModel的缩写&#xff0c;是一种高级项目架构模式。 MVVM架构可以将程序结构主要分成三个部分&#xff1a; Model&#xff1a;数据模型部分&#xff0c;包括从服务端获取的json数据或者从本地获取的数据等等View&…

【GlobalMapper精品教程】056:图像融合(高光谱+全色)操作案例教程

本文讲解GlobalMapperV24.0汉化版图像增强:融合(高光谱+全色)操作案例教程 文章目录 一、图像融合概述二、图像融合案例1. 加载数据2. 图像融合3. 图像导出一、图像融合概述 图像融合是指将不同类型传感器的影像进行融合,既能使图向具有较高的空间分辨率,又具有多光谱的特…

工具篇(五)炫酷排版,尽在LaTeX:让你的文档飞升吧!

作者的话 作为一个文本排版工具&#xff0c;latex一直以来都备受科研工作者、学生和出版社的青睐。但是对于初学者来说&#xff0c;latex的学习曲线可能会有些陡峭。因此&#xff0c;我写这篇博客旨在为初学者提供一个简单易懂的latex教程&#xff0c;让大家能够快速入门并掌握…

C++—输入输出流

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言1. 输入输出流2. 文件的输入输出2.1 写文件2.2 读文件前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 我的电脑为什么从 C 盘开始&#…

Compose 动画 (三) : AnimatedVisibility 从入门到深入

1. AnimatedVisibility 是什么 AnimatedVisibility可以实现Compose组件的显示和隐藏&#xff0c;并且可以指定显示/隐藏时候的动画效果。(EnterTransition/ExitTransition) 和 animateXxxAsState、animateContentSize、Crossfade、AnimatedContent 这几个API一起&#xff0c;都…

一文详解像素、DPI、分辨率之间的关系

像素像素&#xff1a;是指在由一个数字序列表示的图像中的一个最小单位&#xff0c;称为像素。像素可以用一个数表示&#xff0c;比如一个“0.3兆像素”数码相机&#xff0c;它有额定30万像素&#xff1b;也可以用一对数字表示&#xff0c;例如“640x480显示器”&#xff0c;它…

单目标追踪——【相关滤波】C-COT原理与ECO基于C-COT的改进

目录C-COT&#xff1a;Continuous Convolution Operator Tracker文章侧重点连续卷积算子目标追踪框架初始化过滤器&#xff1a;追踪流程ECO文章侧重点因式卷积因子生成采样空间模型模型更新策略论文链接&#xff1a;C-COT&#xff1a;Beyond Correlation Filters: Learning Con…

【MySQL】表连接

一、为什么要学习 因为不合理的使用连接会导致慢查询 二、什么是连接 参与连接的表叫做 连接表&#xff0c; 连接就是把 各个连接表 进行的组合 &#xff08;笛卡儿积&#xff09;加入结果集并返回 三、连接查询 如何只是对表进行大量的连接&#xff0c;笛卡儿积作用得到的…

ChatGPT会取代程序员么?今天让ChatGPT写了个程序,感觉离失业不远了

文章目录ChatGPT会取代程序员么&#xff1f;今天让ChatGPT写了个程序&#xff0c;感觉离失业不远了问题&#xff1a;保存和ChatGPT的聊天记录对话实录以及吐槽1. 把当前页面转成markdown格式的方法2. 用油猴子可以实现么&#xff1f;3. 编写一段油猴子代码&#xff0c;实现刚才…

Redis十大类型——Set与Zset常见操作

Redis十大类型——Set与Zset常见操作Set命令操作简列基本操作展示删除移动剪切集合运算Zset基本操作简列添加展示反转按分数取值获取分数值删除分数操作下标操作如果我们对Java有所了解&#xff0c;相信大家很容易就明白Set&#xff0c;在Redis中也一样&#xff0c;Set的value值…

4、树(中篇)

前言:前节二叉树只能适用于静态查找,不能实现动态插入、删除等。如何解决以下两个问题: 静态查找与动态查找针对动态查找,数据如何组织?4.1 二叉搜索树 4.1.1 什么是二叉搜索树 二叉搜索树(BST,Binary Search Tree),也称二叉排序树或二叉查找树。 二叉搜索树:一棵…

Linux RS232驱动实验

目录 一、硬件分析 1、 RS232 原理图​编辑 2、RS485 原理图 3、GPS 原理图 二、设备树中添加设备节点 2、添加 uart3 节点 ​编辑 三、移植 minicom 1、移植 ncurses 2、移植 minicom 3、验证 4、minicom配置 四、测试 RS232 收发测试 串口是很常用的一个外设&…

SpringSecurity: 默认添加的15个Filter是怎么添加进去的?

总的流程分为两部分&#xff0c;一是先用Map把configurer收集起来&#xff0c;然后再把maper中所有的configurer应用到HttpSecurity对象。 其中的map位于AbstractConfiguredSecurityBuilder这个类。 private final LinkedHashMap<Class<? extends SecurityConfigurer&l…

信息安全与数学基础-笔记-⑤原根与阶

知识目录原根一些求原根的定理↓ordm(a)ord_m(a)ordm​(a) | ϕ(m)\phi(m)ϕ(m)原根和阶的关系原根 什么是原根&#xff1f; 设 &#xff08;a,m&#xff09; 1, 并且aea^eae 三 1 (mod m) &#xff0c;则我们称&#xff1a;ordmord_mordm​(a) e&#xff0c;ord也叫做群论&am…

React组件性能优化若干问题

react组件的性能优化的核心是减少渲染真实DOM节点的频率&#xff0c;减少Virtual DOM比对的频率。组件卸载前执行清理操作在组件中为window 注册的全局事件&#xff0c;以及定时器&#xff0c;在组件卸载前要清理掉。防止组件卸载后继续执行影响应用性能。import React from re…

分享十个前端Web3D可视化框架附地址

Three.js&#xff1a;Three.js是一个流行的3D库&#xff0c;提供了大量的3D功能&#xff0c;包括基本几何形状、材质、灯光、动画、特效等。它是一个功能强大、易于使用的框架&#xff0c;广泛用于Web3D可视化应用程序的开发。Three.js&#xff1a;https://threejs.org/Babylon…

【强烈建议收藏:MySQL面试必问系列之索引专题】

一.知识回顾 前面的文章我们一起学习了数据库的事务、事务以及并发来的问题、数据库锁机制、数据库中CURD的SQL语句底层执行流程、数据库SQL优化专题&#xff0c;如果你一步一步的跟下来&#xff0c;一定会帮助你建立一个知识体系。接下来我们再一起学习数据库索引专题&#x…