金苹果岛代码能力最大化:贪心算法求解
金苹果岛代码能力最大化:贪心算法求解
问题描述
你是一位代码勇者,来到了神秘的金苹果岛。岛上有两种苹果:
- 红苹果: 随处可见,每个红苹果可以提升你的代码能力值,但提升的数值可能不同,甚至可能是负数。- 金苹果: 稀有珍贵,每个金苹果可以使你当前的代码能力值翻倍。
你初始的代码能力值为 1。岛上的苹果仙子会赠送你 n 个红苹果和 m 个金苹果,你需要吃掉所有苹果。红苹果的食用顺序由仙子规定,但你可以自由选择在任意时刻吃金苹果。
请问,如何安排吃苹果的策略,才能使你离开金苹果岛时的代码能力值最大化?
输入格式
- 第一行:两个正整数 n 和 m,分别表示红苹果和金苹果的数量 (n ≤ 10^5, m ≤ 10)。- 第二行:n 个整数 a_i,表示每个红苹果对代码能力的提升值 (|a_i| ≤ 10)。
输出格式
- 一个整数,表示离开金苹果岛时可获得的最大代码能力值。
贪心策略
为了最大化最终的代码能力值,我们可以采用以下贪心策略:
- 优先处理负收益的红苹果: 对于提升值为负数的红苹果,我们希望在代码能力值较低时吃掉它们,以减少其负面影响。2. 尽早使用金苹果: 金苹果的效果是使代码能力值翻倍,因此我们应该尽早使用它们,以便在后续过程中获得更大的收益。
C++ 算法实现cpp#include #include #include
using namespace std;
int main() { int n, m; cin >> n >> m; vector
for (int i = 0; i < n; ++i) { cin >> apples[i]; }
sort(apples.begin(), apples.end()); // 对红苹果的提升值进行排序
long long maxAbility = 1; // 使用 long long 避免溢出 int i = 0;
// 优先处理负收益的红苹果 while (i < n && apples[i] < 0 && m > 0) { maxAbility *= 2; ++i; --m; }
// 处理剩余的红苹果和金苹果 for (; i < n; ++i) { if (apples[i] >= 0) { maxAbility += apples[i]; } else if (m > 0) { maxAbility *= 2; --m; } else { maxAbility += apples[i]; } }
// 使用剩余的金苹果 while (m-- > 0) { maxAbility *= 2; }
cout << maxAbility << endl;
return 0;}
示例分析
输入:
6 21 -2 3 1 -6 5
输出:
15
解释:
- 首先对红苹果的提升值进行排序:
-6, -2, 1, 1, 3, 52. 由于-6和-2是负收益,我们在开始时使用两个金苹果,代码能力变为4。3. 然后依次吃掉剩余的红苹果,最终代码能力变为15。
总结
通过贪心算法,我们可以高效地解决金苹果岛代码能力最大化问题。这个算法的时间复杂度为 O(n log n),主要来自于排序操作。希望这篇文章能帮助你理解并掌握这个算法。
原文地址: https://www.cveoy.top/t/topic/fM1U 著作权归作者所有。请勿转载和采集!