首页 > 其他分享 >1599. 经营摩天轮的最大利润 (Medium)

1599. 经营摩天轮的最大利润 (Medium)

时间:2023-03-06 19:57:41浏览次数:55  
标签:摩天轮 轮转 位登舱 游客 max Medium total 1599

问题描述

1599. 经营摩天轮的最大利润 (Medium)

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

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

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

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

示例 1:

输入:customers = [8,3], boardingCost = 5, runningCost = 6
输出:3
解释:座舱上标注的数字是该座舱的当前游客数。
1. 8 位游客抵达,4 位登舱,4 位等待下一舱,摩天轮轮转。当前利润为 4 * $5 - 1 * $6 = $14
。
2. 3 位游客抵达,4 位在等待的游客登舱,其他 3 位等待,摩天轮轮转。当前利润为 8 * $5 - 2 * $6
= $28 。
3. 最后 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 = $20
。
2. 9 位游客抵达,4 位登舱,11 位等待(2 位是先前就在等待的,9 位新加入等待的),摩天轮轮转。当前利润为 8
* $6 - 2 * $4 = $40 。
3. 最后 6 位游客抵达,4 位登舱,13 位等待,摩天轮轮转。当前利润为 12 * $6 - 3 * $4 =
$60 。
4. 4 位登舱,9 位等待,摩天轮轮转。当前利润为 * $6 - 4 * $4 = $80 。
5. 4 位登舱,5 位等待,摩天轮轮转。当前利润为 20 * $6 - 5 * $4 = $100 。
6. 4 位登舱,1 位等待,摩天轮轮转。当前利润为 24 * $6 - 6 * $4 = $120 。
7. 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 = -$89 。
2. 4 位游客抵达,4 位登舱,0 位等待,摩天轮轮转。当前利润为 is 7 * $1 - 2 * $92 =
-$177 。
3. 0 位游客抵达,0 位登舱,0 位等待,摩天轮轮转。当前利润为 7 * $1 - 3 * $92 = -$269
。
4. 5 位游客抵达,4 位登舱,1 位等待,摩天轮轮转。当前利润为 12 * $1 - 4 * $92 = -$356
。
5. 1 位游客抵达,2 位登舱,0 位等待,摩天轮轮转。当前利润为 13 * $1 - 5 * $92 = -$447
。
利润永不为正,所以返回 -1 。

提示:

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

解题思路

模拟

代码

class Solution {
  public:
    int minOperationsMaxProfit(vector<int> &customers, int boardingCost, int runningCost) {
        if (boardingCost * 4 <= runningCost) {
            return -1;
        }
        int total_cost = 0;
        int total_get = 0, people = 0;
        int max_profit = INT_MIN;
        int max_idx = 0;
        for (int i = 0; i < customers.size() || people > 0; i++) {
            if (i < customers.size()) {
                if (people + customers[i] <= 4) {
                    total_cost += runningCost;
                    total_get += boardingCost * (people + customers[i]);
                    if (total_get - total_cost > max_profit) {
                        max_profit = total_get - total_cost;
                        max_idx = i;
                    }
                    people = 0;
                } else {
                    total_cost += runningCost;
                    total_get += boardingCost * 4;
                    if (total_get - total_cost > max_profit) {
                        max_profit = total_get - total_cost;
                        max_idx = i;
                    }
                    people = people + customers[i] - 4;
                }
            } else {
                if (people > 4) {
                    total_cost += runningCost;
                    total_get += boardingCost * 4;
                    if (total_get - total_cost > max_profit) {
                        max_profit = total_get - total_cost;
                        max_idx = i;
                    }
                    people -= 4;
                } else {
                    total_cost += runningCost;
                    total_get += boardingCost * people;
                    if (total_get - total_cost > max_profit) {
                        max_profit = total_get - total_cost;
                        max_idx = i;
                    }
                    people = 0;
                }
            }
        }
        if (max_profit <= 0) {
            return -1;
        }
        return max_idx + 1;
    }
};

标签:摩天轮,轮转,位登舱,游客,max,Medium,total,1599
From: https://www.cnblogs.com/zwyyy456/p/17185121.html

相关文章

  • 209. 长度最小的子数组 (Medium)
    问题描述209.长度最小的子数组(Medium)给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其和≥target的长度最小的连续子数组[numsₗ,num......
  • 1487. 保证文件名唯一 (Medium)
    问题描述1487.保证文件名唯一(Medium)给你一个长度为n的字符串数组names。你将会在文件系统中创建n个文件夹:在第i分钟,新建名为names[i]的文件夹。由于两个......
  • 464. 我能赢吗 (Medium)
    问题描述464.我能赢吗(Medium)在"100game"这个游戏中,两名玩家轮流选择从1到10的任意整数,累计整数和,先使得累计整数和达到或超过100的玩家,即为胜者。如果我......
  • 1405. 最长快乐字符串 (Medium)
    问题描述1405.最长快乐字符串(Medium)如果字符串中不含有任何'aaa','bbb'或'ccc'这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。给你三个整数a,b,c......
  • 1140. 石子游戏 II (Medium)
    问题描述1140.石子游戏II(Medium)爱丽丝和鲍勃继续他们的石子游戏。许多堆石子排成一行,每堆都有正整数颗石子piles[i]。游戏以谁手中的石子最多来决出胜负。爱丽丝......
  • 179. 最大数 (Medium)
    问题描述179.最大数(Medium)给定一组非负整数nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而......
  • 524. 通过删除字母匹配到字典里最长单词 (Medium)
    问题描述524.通过删除字母匹配到字典里最长单词(Medium)给你一个字符串s和一个字符串数组dictionary,找出并返回dictionary中最长的字符串,该字符串可以通过删除s......
  • 89. 格雷编码 (Medium)
    问题描述89.格雷编码(Medium)n位格雷码序列是一个由2ⁿ个整数组成的序列,其中:每个整数都在范围[0,2ⁿ-1]内(含0和2ⁿ-1)第一个整数是0一个整数在序列......
  • 397. 整数替换 (Medium
    问题描述397.整数替换(Medium)给定一个正整数n,你可以做如下操作:如果n是偶数,则用n/2替换n。如果n是奇数,则可以用n+1或n-1替换n。返回n变为......
  • 1238. 循环码排列 (Medium)
    问题描述1238.循环码排列(Medium)给你两个整数n和start。你的任务是返回任意(0,1,2,,...,2^n-1)的排列p,并且满足:p[0]=startp[i]和p[i+1]的二进制表示形......