为什么我在这里遇到了段错?

时间:2014-08-12 18:24:02

标签: c++

问题陈述

马克是一名本科生,他对轮换感兴趣。马克希望赢得一个传送带比赛正在进行。在比赛中,有一条传送带,可以表示为1xN块的条带。每个块上都写有一个数字。皮带保持旋转,每次旋转后,每个程序段都会向左移动,第一个程序段将转到最后位置。

传送带附近有一个开关可以阻止皮带。每个参与者都有一次机会阻止腰带,他的PMEAN将被计算出来。

PMEAN使用皮带停止时的顺序计算。具有最高PMEAN的参与者是赢家。可以有多个获胜者。

马克希望成为赢家之一。他应该尝试哪种PMEAN来保证他成为赢家。

解释

  • PMEAN =(i = 1到n的总和)(i * i列表中的数字) 其中i是传送带停止时块的索引。索引从1开始。

输入格式

  • 第一行包含N,表示皮带上的元素数量。
  • 第二行包含N个空格分隔的整数。

输出格式

  • 输出所需的PMEAN

约束

  • 1≤N≤10^ 6
  • -10 ^9≤每个数字≤10^ 9

代码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main (void)
{
    int n;
    cin>>n;
    vector <int> foo;
    int i = 0,j = 0,k,temp,fal,garb=0;
    while (i < n)
    {
        cin>>fal;
        foo.push_back(fal);
        i++;

    }
    vector<int> arr;
    //arr.reserve(10000);
    for ( i = 0; i < n; i++ )
    {
        garb = i+1;
        arr.push_back(garb);    
    }
    long long product = 0;
    long long bar = 0;

    while (j < n)
    {
        i = 0;
        temp = foo[0];
        while ( i < n-1 )
        {
            foo[i] = foo[i+1];
            i++;
        }
        foo[i] = temp;
        for (  k = 0; k < n; k++ )
            bar = bar + arr[k]*foo[k];    

        if ( bar > product )
            product = bar;    

        j++;
    }
    return 0;

}

我的问题:

我正在做的是基本上尝试原始数组的不同组合,然后将其与包含值1 2 3 ......的数组相乘,然后返回最大值。但是,我在这里遇到了分段错误。

为什么会这样?

1 个答案:

答案 0 :(得分:3)

以下是您的部分代码:

vector <int> foo;
int i = 0;
while (i < n)
{
    cin >> fal;
    foo[i] = fal;
    i++;
}

执行foo[0] = fal时,会导致未定义的行为。 foo [0]还没有vector<int> arr;空间。您可能希望改为使用std::vector::push_back()

当您使用for (int i=0; i<n; i++) { int fal; cin >> fal; foo.push_back(fal); }

时,也会出现同样的问题

另外,人们通常会使用for循环编写该循环:

i

With regards to the updated code

  • 您永远不会在第一个循环中增加garb
  • {{1}}永远不会被初始化。