1 条题解

  • 1
    @ 2026-4-5 14:31:43
    #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
    上传者