Every day a Leetcode
题目来源:3207. 与敌人战斗后的最大分数
解法1:贪心
设 enemyEnergies 中的最小值为 minEnergy,元素和为 sum。
如果 currentEnergy < minEnergy,那么操作一无法执行,无法得到任何分数,所以也无法执行操作二,返回 0。
否则,操作顺序如下:
- 对 minEnergy 执行操作一,得到 1 分。
- 对除了 minEnergy 以外的敌人执行操作二,得到 sum − minEnergy 的能量。
- 对 minEnergy 执行操作一,直到能量不足。
- 也可以理解为,先得到 sum − minEnergy 的能量,再不断对 minEnergy 执行操作一,所以得分为 (currentEnergy + sum - minEnergy) / minEnergy。
代码:
/*
* @lc app=leetcode.cn id=3207 lang=cpp
*
* [3207] 与敌人战斗后的最大分数
*/
// @lc code=start
class Solution
{
public:
long long maximumPoints(vector<int> &enemyEnergies, int currentEnergy)
{
int minEnergy = *min_element(enemyEnergies.begin(), enemyEnergies.end());
if (currentEnergy < minEnergy)
return 0;
long long sum = accumulate(enemyEnergies.begin(), enemyEnergies.end(), 0LL);
return (currentEnergy + sum - minEnergy) / minEnergy;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是数组 enemyEnergies 的长度。
空间复杂度:O(1)。