金苹果岛 - 代码勇者吃苹果最大化代码能力
金苹果岛
题目描述
代码勇者来到了金苹果岛上,金苹果岛上有两种苹果:随处可见的红苹果与稀有美味的金苹果。
勇者的'初始代码能力为 $1$',他每吃下一个红苹果,代码能力就会得到一定程度的提升(每个红苹果带来的提升可能是不同的,甚至也可能是负的);他每吃下一个金苹果,代码能力就会直接'翻倍'(每个金苹果的效果都是完全相同的)。
岛上的苹果仙子用 $n$ 个红苹果和 $m$ 个金苹果招待了勇者,勇者必须吃光所有苹果。勇者必须按照仙子'规定的顺序'吃红苹果,但是他可以'自由安排'什么时候吃金苹果(可以在吃'任意'一个红苹果之前或之后吃'若干'个金苹果)。
求勇者在离开金苹果岛的时候的代码能力的最大值。
输入格式
第一行输入两个正整数 $n$($n \le 10^5$)和 $m$($ m \le 10$)。
第二行输入 $n$ 个整数 $a_i$($|a_i| \le 10$)。
输出格式
输出一个整数,表示勇者在离开金苹果岛的时候的代码能力的最大值。
样例 #1
样例输入 #1
6 2
1 -2 3 1 -6 5
样例输出 #1
15
样例 #2
样例输入 #2
8 3
5 -3 -8 2 4 -11 9 1
样例输出 #2
42
提示
样例1解释
勇者吃掉红苹果 $1,-2,3,1$,代码能力变为 $4$;
勇者吃掉 $2$ 颗金苹果,代码能力变为 $16$;
勇者吃掉红苹果 $-6,5$,代码能力变为 $15$。
这是勇者的最优方案。
子任务
对于 $10%$ 的数据,$a_i \ge 0$;
对于 $30%$ 的数据,$m=0$;
对于 $70%$ 的数据,$m=1$;
对于 $100%$ 的数据,$n \le 10^5, m \le 10, |a_i| \le 10$。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> redApples(n);
for (int i = 0; i < n; i++) {
cin >> redApples[i];
}
sort(redApples.begin(), redApples.end());
int codeAbility = 1;
int maxAbility = 1;
for (int i = 0; i < n; i++) {
if (redApples[i] >= 0) {
codeAbility += redApples[i];
maxAbility = max(maxAbility, codeAbility);
} else {
if (m > 0) {
codeAbility *= 2;
m--;
maxAbility = max(maxAbility, codeAbility);
} else {
codeAbility += redApples[i];
maxAbility = max(maxAbility, codeAbility);
}
}
}
cout << maxAbility << endl;
return 0;
}
这个代码使用了贪心算法的思想。首先将红苹果按照从小到大的顺序排序,然后遍历红苹果。
如果当前红苹果的数值大于等于0,则直接将其加到代码能力上,并更新最大能力值。
如果当前红苹果的数值小于0,则有两种情况:
- 如果还有金苹果剩余,则将代码能力翻倍,金苹果数减1,并更新最大能力值。
- 如果没有金苹果剩余,则将当前红苹果数值加到代码能力上,并更新最大能力值。
最终输出最大能力值即可。
原文地址: https://www.cveoy.top/t/topic/fM1K 著作权归作者所有。请勿转载和采集!