1、贪心
我们可以利用贪心法计算我们当前需要的最少的用于锻炼经验和精力的时间。显然,我们想要求得最少的初始精力,我们需要将所有精力相加,而后将结果加一即为我们需要的最少精力。我们此时只需要对 0 和 res - initialEnergy + 1
求最大值即可获得我们需要花费给精力的时间。
对于求得需要锻炼经验的时间,我们需要在遍历经验的数组过程中将所有结果相加,并将相加后的结果与当前的值进行比较:
- 若当前的经验之和大于此时的经验,说明 i + 1 > initialExperience,我们不需要增加我们初始花在经验上的时间,故初始时间不需要增加,我们更新当前经验综合即可;
- 若当前的经验之和小于等于此时的经验,说明 i + 1 <= initialExperience,我们需要增加 i + 1 - initialExperience 初始花在经验上的时间,故在结果和当前之和上进行更新。
class Solution {
public:
int minNumberOfHours(int initialEnergy, int initialExperience, vector<int> &energy, vector<int> &experience) {
int res = 0;
for (int i: energy) {
res += i;
}
res = max(0, res - initialEnergy + 1);
for (int i: experience) {
res += max(0, i + 1 - initialExperience);
initialExperience += i + max(0, i + 1 - initialExperience);
}
return res;
}
};