题目链接: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)\)。