得到一些数组的总和'元素C ++

时间:2016-01-16 10:06:29

标签: c++ arrays

如果给出,我怎么可能得到数组中两个给定点之间的元素总和:

n - 数组长度

m - 关于数组的问题数

a [n] - 数组编号

m格式x y

的问题
  

示例

     

输入

     

3 3

     

-1 2 0

     

3 3

     

1 3

     

1 2

     

输出

     

0

     

1

     

1

这是我的代码

#include <iostream>
#include <numeric>
using namespace std;
int main()
{
    int n,m,x,y;
    cin>>n>>m;
    int a [n];
    int s [m];
    for (int i = 0; i < n; i++){
        cin>>a[i];
    }
    for (int i = 0; i < m ; i++){
        cin>>x>>y;
        if(x == y){
            s[i] = a[x-1];
            continue;
        }
        s[i] =  accumulate(a + x - 1, a + y,0);
    }
    for (int i = 0; i < m; i++){
        cout<<s[i]<<endl;
    }
    return 0;
}

这不是学校的家庭作业,只是来自互联网的任务 - 它将使用Standard streams在测试服务器上运行以进行输入和结果检查。 < / p>

我需要这个程序在不到0.2秒的时间内运行:

0&lt; n,m <= 50000

-1000&lt; = a [i]&lt; = 1000

1·; = X&LT; = Y&LT; = N

如何让它更有效地运行?

1 个答案:

答案 0 :(得分:2)

accummulaten很大时,m功能可以花费大量时间。

我们在示例中使用以下数据:

const int n = 10;

int a[n] = {6, 1, 3, 2, 9, 8, 7, 2, 0, 1};

让我们创建一个辅助数组,并为每个a[0]填充a[i]i之和。这可以在一个循环中完成。

int s[n+1];

void precalculate() {
    s[0] = 0;
    for (int i = 0; i < n; ++i) {
        s[i+1] = s[i] + a[i];
    }   
}

然后整个accummulate函数折叠为单个减法:

int accummulate(int i, int j) {
    return s[j] - s[i-1];
}

它很好用,因为它可以很容易地证明:

int main() {
    precalculate();
    assert(accummulate(1, 1) == 6);
    assert(accummulate(10, 10) == 1);
    assert(accummulate(1, 10) == 39);
    return 0;
}