C ++匹配支架2解决方案不起作用

时间:2018-10-25 10:29:11

标签: c++

这个问题与我解决的here类似,尽管该算法适用于示例案例,但仍给了我一个错误的答案。这次我已初始化所有变量,并且适用于的修改版本我以前的算法。

#include <iostream> 

int main() {
    int n;
    std::cin >> n;
    int arr[n];
    for (int i = 0; i <n ;++i) {
        std::cin >> arr[i];
    }
    int four_count = 0, two_count = 0, three_long=0, one_long = 0 , max1_long = 0 ,max3_long = 0,a_depth = 0,max_depth = 0;
    for (int i = 0; i < n; ++i) {
        if (arr[i] == 3) {
            if (arr[i+1] == 1) {
                ++a_depth;
                if (a_depth > max_depth) {
                    max_depth = a_depth;
                } 
            }
            ++four_count;
            three_long += 2; 
        }
        if (arr[i] == 1) {
            if (arr[i+1] == 3) {
                ++a_depth;
                if (a_depth > max_depth) {
                    max_depth = a_depth;
                } 
            }
            ++two_count;
            one_long += 2 ; 
        }
        if (arr[i] == 2) {
            if (arr[i+1] == 4 && i < n-1) {
                --a_depth;
            }
            --two_count;  
        }
        if (arr[i] == 4) {
            if (arr[i+1] == 2 && i < n-1){
                --a_depth;
            }
            --four_count;
        }
        if (four_count == 0 && two_count == 0) {
            if (three_long >= one_long) {
                if (three_long > max3_long) {
                    max3_long = three_long+one_long;
                }
                three_long = 0;
                one_long = 0; 
            }
            else {
                if (one_long > max1_long) {
                    max1_long = one_long+three_long;
                }
                one_long = 0;
                three_long = 0;
            }
        }

    } 
    std::cout << max_depth*2 << " " << max1_long << " " << max3_long;
    std::cout << "\n";
    return 0;

}

这里是问题的链接:

https://www.codechef.com/ZCOPRAC/problems/ZCO12003

2 个答案:

答案 0 :(得分:2)

在下面的代码中:

   for (int i = 0; i < n; ++i) {
        if (arr[i] == 3) {
            if (arr[i+1] == 1) {

i到达n-1时,arr[i+1]变成arr[n],导致超出范围的内存访问,这将导致不确定的行为。

答案 1 :(得分:1)

假设n等于5。这意味着数组arr的索引最大为4,因为第一个为0

在您的循环中

for (int i = 0; i < n; ++i)
    { if (arr[i] == 3) {
        if (arr[i+1] == 1) {

在某个时候i变成n-1,所以i == 4,然后尝试arr[i+1]的意思是arr[5],这超出了范围。

请注意,在P.Ws帖子的评论中,您尝试了if (arr[i+1] == 1 && i < n-1)来解决此问题。那将行不通,因为仍然有一个arr[i+1]正在执行。您可以使用

来解决此问题
if(i < n-1) { 
    if(arr[i+1]) {

但这将意味着ifs的嵌套更深。您可能应该重新考虑解决给定问题的方法。

编辑:确定是++i而不是i++吗?