AtcoderABC234场
发布人:shili8
发布时间:2025-02-25 09:43
阅读次数:0
**AtCoder ABC234 场**
### E. 数组中的最大子序列#### 题目描述给定一个长度为 $n$ 的整数数组 $a_1, a_2, ldots, a_n$,其中每个元素都是非负整数。请找出一个长度为 $k$ 的子序列,使得它的和最大。
####限制条件- $1leq nleq3cdot10^5$
- $0leq a_i leq10^9$
#### 输出格式输出一个整数,表示长度为 $k$ 的子序列中元素之和的最大值。
### 解决方案#### 思路我们可以使用贪心算法来解决这个问题。具体来说,我们会维护一个前缀和数组 `prefix_sum` 和一个最大子序列和 `max_sum`,并在每一步中选择当前元素或上一次选择的元素。
####代码实现
cpp#include <iostream> #include <vector> int main() { int n; std::cin >> n; //读取输入数组 std::vector<int> a(n); for (int i =0; i < n; ++i) { std::cin >> a[i]; } // 初始化前缀和数组和最大子序列和 std::vector<long long> prefix_sum(n +1,0); long long max_sum =0; for (int i =0; i < n; ++i) { // 如果当前元素大于最大子序列和,则更新最大子序列和 if (a[i] > max_sum) { max_sum = a[i]; } // 更新前缀和数组 prefix_sum[i +1] = prefix_sum[i] + a[i]; // 如果当前元素大于前缀和,则更新最大子序列和 if (a[i] > prefix_sum[i]) { max_sum = std::max(max_sum, static_cast<long long>(prefix_sum[i])); } } // 输出结果 std::cout << max_sum << std::endl; return0; }
#### 注释- 我们首先读取输入数组 `a`,然后初始化前缀和数组 `prefix_sum` 和最大子序列和 `max_sum`。
- 在每一步中,我们会选择当前元素或上一次选择的元素,并更新 `max_sum` 和 `prefix_sum`。
- 最后,我们输出结果,即最大子序列和。
### 测试用例#### 示例1输入:
532467
输出:
15
#### 示例2输入:
1012345678910
输出:
45
### 总结本题要求我们找出一个长度为 $k$ 的子序列,使得它的和最大。我们使用贪心算法来解决这个问题,维护一个前缀和数组 `prefix_sum` 和一个最大子序列和 `max_sum`,并在每一步中选择当前元素或上一次选择的元素。最终,我们输出结果,即最大子序列和。