一、问题引入
读入100000个整数。有100000次查询,每次查询给出x和y,表示求第x个数至第y个数的和。
问题分析:
读入100000个整数保存到数组a。
对于每一个查询,用循环把数组的第x个数至第y个数累加并输出,大致框架如下:
for(int i=1; i<=100000;i++)
{
int a,b, sum = 0;
cin>>a>>b;
for(int j=a; j<=b; j++) sum = sum + a[j];
cout<<sum<<endl;
}
但是运行之后得到的结果是超时,得0分:
![](https://i-blog.csdnimg.cn/blog_migrate/0c2c1b7bd3345afe2c9e1022a9bf3959.png)
为什么会超时呢?先来看看上面的程序最坏会进行几次运算?
for(int i=1; i<=100000;i++)//共询问100000次
{
int a,b, sum = 0;
cin>>a>>b
for(int j=a; j<=b; j++) sum = sum + a[j]; //当a=1且b=100000时,每一次询问,语句sum=sum+a[j]都会运算100000次
cout<<sum<<endl;
}
所以上面的程序最坏的情况是运算100000 * 100000 = 10^10次。
在信息学当中,我们一般认为1秒的时间可以运算10^8次,所以上面的程序需要运行100秒。因为信息学的题目一般规定运行的时间都是1秒左右,所以上面的程序就超时啦。
![](https://i-blog.csdnimg.cn/blog_migrate/5123157f1f5c89ea8b18697e6bd69ca1.png)
那么这道题目如何才能不超时呢?
样例:
第1题 多次求一段和(课程E) 查看测评数据信息
输入N个整数的数组A,然后有M个询问。每个询问给2个整数a和b,问数组的第a个到第b个的和是多少?
输入格式
第一行2个正整数:N和M,N、M的范围在[1,100000]。
第二行N个正整数:范围在[1,100]。
下面有M行,每行2个整数a和b,a、b的范围在[1,N]。 M个整数,每个数一行,对应M个询问。
输出格式
M个整数,每个数一行,对应M个询问。
输入/输出例子1
输入:
5 2
3 6 2 7 9
1 3
4 3
输出:
11
9
#include<bits/stdc++.h>
using namespace std;
int number[100050];
int main(){
int a,question,start,finish,cnt=0;
cin>>a>>question;
for(int i=1;i<=a;i++)
{
cin>>number[i];
}
for(int i=1;i<=question;i++)
{
cnt=0;
cin>>start>>finish;
if(start>finish)
{
swap(start,finish);
}
for(int j=start;j<=finish;j++)
{
cnt+=number[j];
}
cout<<cnt<<endl;
}
return 0;
}