1 条题解
-
1
#include<bits/stdc++.h> using namespace std; int main(){ // 定义数组,最大支持 10^7 个元素(满足题目 1e6 要求) int a[10000000]; // n:数组长度 left:最终答案起始下标 right:最终答案结束下标 // c_l:当前正在累加的子数组的起始下标 int n = 9, left = 0, right = 0, c_l = 0; cin >> n; // 输入数组长度 for(int i = 0; i < n; i++){ cin >> a[i]; // 输入数组元素 } // c:当前连续子数组的和 // r:全局最大子数组和(最终答案) // 初始状态:把第一个元素作为初始子数组 int c = a[0], r = a[0]; // 从第二个元素开始遍历 for(int i = 1; i < n; i++){ // 核心:卡丹算法判断 // 如果 单独选当前元素 比 加上前面子数组 更大 // 说明前面的子数组可以抛弃,从当前位置重新开始 if(a[i] > a[i] + c){ c_l = i; // 更新当前子数组的起始下标 c = a[i]; // 当前和 = 当前元素 }else{ c = a[i] + c; // 否则继续累加前面的子数组 } // 如果当前子数组和 > 全局最大和 // 更新最大和,并记录此时的左右下标 if(r < c){ right = i; // 结束下标 = 当前位置 left = c_l; // 起始下标 = 当前子数组起点 r = c; // 更新全局最大和 } } // 输出结果 cout << r << endl; // 输出最大和 cout << left << " " << right; // 输出起止下标 return 0; }
- 1
信息
- ID
- 4577
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 29
- 已通过
- 8
- 上传者
粤公网安备44195502000195号