如何减少此代码的执行时间

时间:2017-11-16 22:59:11

标签: algorithm c++11 sum

问题是用户输入N,1&lt; = N&lt; = 1000000,然后N行和Q数1 <= Q&lt; = 1000000然后Q行每个包含两个空格分隔a,b数。对于每一行我需要打印从第a行到第b行的数字总数。 例如我输入:

5     // N
1     // First line
2     // Second line ... to fifth
3 
4
5
3    // Q
0 4  // the two numbers a, b... Q times
1 3
2 2

输出将是

15 // from 0 to 4 : 1+2+3+4+5=15
9  // from 1 to 3 : 2+3+4=9
3  // from 2 to 2 : 3

如果Q和N大于100000,我的代码执行时间超过5秒

#include <bits/stdc++.h>
#include<vector>
#include<numeric>
#include<functional>
using namespace std;

int main() {
int a,b,c,p1,p2,sum(0);
vector<int>t(0);
cin>>a;
for(int i(0);i<a;++i)
{
    cin>>b;
    t.push_back(b);
}
cin>>c;
for(int i(0);i<c;++i)
{
    sum=0;
    cin>>p1>>p2;
    sum=accumulate(t.begin()+p1,t.begin()+p2+1,0);
    cout<<sum<<endl;
}
return 0;
}

1 个答案:

答案 0 :(得分:2)

不是将数字保存在数组中并每次计算总数,而是计算运行总和并将该总和存储在数组中。

例如,根据数字[1,2,3,4,5],您的t向量将包含[1, 3, 6, 10, 15]。您可以轻松修改代码以构建:

int sum = 0;
t.push_back(sum);  // see discussion below
for(int i(0);i<a;++i)
{
    cin>>b;
    sum += b;
    t.push_back(sum);
}

然后,当要求总和时,从结束索引处的数字中减去之前起始索引之前的值是一个简单的问题。例如:

1,3 : result = t[3] - t[0]
2,2 : result = t[2] - t[1]

如果起始索引为0,那么你根本不会减去任何东西。我首先将0和推到向量的原因是处理p1 = 0时的情况。否则,我必须特殊情况。 (感谢@ max66的建议。)

您的计算循环变为:

for(int i(0);i<c;++i)
{
    cin>>p1>>p2;
    sum=t[p2+1] - t[p1];
    cout<<sum<<endl;
}