题目:数苹果
描述
今年苹果大丰收了,大人们在忙着采摘苹果,摘下来的苹果堆放成了很多堆,所有的苹果堆排成了一排。宣宣一个人在苹果堆旁边玩,她已经知道每堆里有多少个苹果。
现在,她想知道从第a堆到第b堆共有多少个苹果。你能帮帮她吗?
输入
输入文件名为apple.in。
第一行,一个整数n,表示苹果堆的个数;
第二行,n个正整数,依次表示第1堆、第2堆、……、第n堆的苹果个数;
第三行,一个整数m,表示询问的次数;
以下m行,每行两个正整数a,b,表示问从第a到b堆的苹果个数。
输出
输出文件名为apple.out。
对于每个询问a,b输出一行,表示第a堆到第b堆的苹果个数。
输入样例
5 1 2 3 4 5 3 1 3 2 4 1 5
输出样例
6 9 15
提示
对于100%的数据:每堆苹果的数量<=100; a<=b。
对于40%的数据:n,m<=1000;
对于100%的数据:n,m<=100000。
这道题如果用循环,运行时会超时
在此,有一个新方法,在输入a[ i ]时将a[ i ]的值设为前面所有数字相加的和,输出时只需输出
a[ y ]-a[ x-1 ]的值。
输入: | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
存入: | 1 | 3 | 6 | 10 | 15 |
这样,代码就不会运行超时了
#include <iostream>
using namespace std;
int main()
{
long long int n,x,y,m,i,j,sum;
cin >> n;
int a[n+1];
a[0]=0;
for (i=1;i<=n;i++)
{
cin >> a[i];
a[i]+=a[i-1];//a[i]的值等于目前所有输入的值的和
}
cin >> m;
for (i=1;i<=m;i++)
{
cin >> x >> y;
sum = a[y]-a[x-1];//输出x至y堆苹果的和
cout << sum << endl;
}
return 0;
}