当前位置:实例文章 » 其他实例» [文章]AtcoderABC234场

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`,并在每一步中选择当前元素或上一次选择的元素。最终,我们输出结果,即最大子序列和。

相关标签:算法
其他信息

其他资源

Top