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

发布时间 2023-04-08 18:50:24作者: lxy_cn

题目链接:1599. 经营摩天轮的最大利润

方法:模拟

解题思路

模拟全部游客都进行游玩,计算其中能赚取的最大利润值以及对应的次数。

代码

class Solution {
public:
  int minOperationsMaxProfit(vector<int>& customers, int boardingCost, int runningCost) {
    int n = customers.size();
    int cnt = 0, value = 0,  idx = 0, waitNum = 0; // currently
    int valueMax = 0, ans = 0; // 最大利润值以及对应次数
    while (idx < n) {
      waitNum += customers[idx ++ ];
      // 登舱
      if (waitNum >= 4) {
        waitNum -= 4;
        value += 4 * boardingCost;
      } else {
        value += waitNum * boardingCost;
        waitNum = 0;
      }
      // 旋转1 / 4
      cnt ++ ;
      value -= runningCost;
      if (value > valueMax) { // 假设此时停止上人,计算是否为最大利润
        valueMax = value;
        ans = cnt;
      }
    }
    while (waitNum >= 4) {
      // 登舱
      waitNum -= 4;
      // 旋转
      cnt ++ ;
      value += 4 * boardingCost - runningCost;
      if (value > valueMax) { // 假设此时停止上人,计算是否为最大利润
        valueMax = value;
        ans = cnt;
      }
    }
    if (waitNum > 0 && waitNum * boardingCost > runningCost) {
      // 登舱,旋转
      cnt ++ ;
      value += waitNum * boardingCost - runningCost;
      if (value > valueMax) { // 假设此时停止上人,计算是否为最大利润
        valueMax = value;
        ans = cnt;
      }
    }
    if (valueMax > 0) return ans; // 返回最大利润对应的次数
    else return -1;
  }
};

复杂度分析

时间复杂度:\(O(m)\)\(m\)为游客数量;
空间复杂度:\(O(1)\)