Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何优化最大和码,使我得到的tie_C++_Arrays_C++11_Sum_C++14 - Fatal编程技术网

C++ 如何优化最大和码,使我得到的tie

C++ 如何优化最大和码,使我得到的tie,c++,arrays,c++11,sum,c++14,C++,Arrays,C++11,Sum,C++14,给定以循环方式排列的N个整数的数组arr[]。您的任务是找到最大连续子阵列和 输入: 输入的第一行包含一个表示测试用例数量的整数T。每个测试用例的第一行包含一个表示元素总数的整数N。每个测试用例的第二行包含N个表示数组元素的空格分隔整数 输出: 对于每个测试用例,打印通过添加连续元素获得的最大和 我快发疯了 我试过钥匙。早于从索引0开始的 int n; cin >> n; vector<int> A; for(int i=0; i<n

给定以循环方式排列的N个整数的数组arr[]。您的任务是找到最大连续子阵列和

输入: 输入的第一行包含一个表示测试用例数量的整数T。每个测试用例的第一行包含一个表示元素总数的整数N。每个测试用例的第二行包含N个表示数组元素的空格分隔整数

输出: 对于每个测试用例,打印通过添加连续元素获得的最大和

我快发疯了

我试过钥匙。早于从索引0开始的

    int n;
    cin >> n;
    vector<int> A;
    for(int i=0; i<n; i++){
        int temp;
        cin >> temp;
        A.push_back(temp);
    }

    for(int i=0; i<n; i++){
        A.push_back(A[i]);
    }

    /*for(int i=0; i<A.size(); i++){
        cout << A[i] << " ";
    }*/
    int asum=0;
    int key=0;
    for(int i=0; i<n; i++){
        asum = asum + A[i];
        if(asum<0) key=i;
    }

    cout << key << "K" << endl;

    int max_sum = INT_MIN;

    for(int i=key; i<n; i++){
        int times = n;
        int sum=0;
        for(int j=i; times>0; j++){
            sum = sum + A[j];
            if(sum>max_sum) max_sum = sum;
            if(sum<0) sum=0;
            times--;
        }
    }

    cout << max_sum << endl;

错误。我检查了小箱子。它工作得非常好。

您需要更改算法。更好的方法是:在A的开头和结尾找到两个子数组,它们的和最小。这样,剩余数组的和就是total-sum\u l-sum\r

问题是,这两个最小子数组可以在线性时间内找到。首先扫描以从末尾查找运行总和。再次扫描以找到左侧和右侧的最佳最小运行总和。省省吧。再次扫描以查找最佳运行和的最小和

如果解决方案没有得到充分解决,那么这将为您提供答案。如果答案很简单,你只需要最大化sum_l和sum_r。计算两个振打或不保持最佳

例如,A={-5,6,-2,-1,8,-2};你会得到:

和l-5,1,-1,-2,6,4

求和4,9,3,5,6,-2

最佳值为-5、-5、-5、-5、-5、-5、-5

最佳r-2,-2,-2,-2,-2,-5

总数4

最佳组合:-7

最佳结果:4--7=11


它是6-2-1+8

线性阵列中的最大子阵列和是一个可以解决的经典问题

这里我们有一个圆形阵列,所以我们将在任意点将其拆分为一个线性阵列。现在,最大子阵列将包含拆分点,或者不包含拆分点。在后一种情况下,子阵列将是展开线性阵列中的连续子阵列,因此可以使用上述算法计算答案


如果子阵列包含拆分点,则它将对应于展开阵列的前缀以及与前缀不重叠的后缀。该和的总和只是整个数组的和减去中间子数组之和的总和。因此,您可以使用相同的算法找到具有最小和的子阵列,并从总和中减去它。

您是否在启用优化的情况下编译?如果不是,那应该是第一步。第0步将考虑降低解决方案的算法复杂性。第2步是通过探查器运行编译器优化的代码,以识别瓶颈。N个整数以循环方式排列意味着什么?TLE通常意味着您的算法不是最优的。请解释您编写的算法。每个循环都做什么?你在计算什么?为什么?在线性版本中,解决该问题的典型方法是将每个值的左边和右边的值相加。然后分别从左右两侧获得最佳切割点。然后检查切割点的最佳组合。这三项工作都可以在线性时间内完成。这可能适用于循环缓冲区。看起来你有一个嵌套的for循环,这意味着当考虑到循环时,你的算法将不起作用,比如对于{8-8 9-9 10-11 12}你错过了答案,如果答案不清楚,你只需要最大化sum_l和sum_r部分。实际上,我把它编好了,并进行了测试。不过,我不会为你提出整个解决方案。这个答案是作为指导:-