对于定义数组还是要强调再强调(数组一定要定义到外面啊!!!)
本次碰到的题目还是相当简单的,前缀和与高中数学的数列还是非常相像的,即对于求一个1——n数列中a[l]——a[r]的和可以是S[r]-S[l-1];
输入一个长度为n的整数序列。
接下来再输入m个询问,每个询问输入一对l, r。
对于每个询问,输出原序列中从第l个数到第r个数的和。
输入格式
第一行包含两个整数n和m。
第二行包含n个整数,表示整数数列。
接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。
输出格式
共m行,每行输出一个询问的结果。
数据范围
1≤l≤r≤n,
1≤n,m≤100000
−1000≤数列中元素的值
思路就是上面提到的前缀和了。
下面看两个代码:
第一个代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int sum[100010];
signed main()
{
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
sum[i]+=sum[i-1]+a;
}
while(q--)
{
int l,r;
cin>>l>>r;
cout<<sum[r]-sum[l-1]<<endl;
}
}
(这个代码是正确的)
第二个代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int n,q;
cin>>n>>q;
int sum[100010];
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
sum[i]+=sum[i-1]+a;
}
while(q--)
{
int l,r;
cin>>l>>r;
cout<<sum[r]-sum[l-1]<<endl;
}
}
可以看出两个代码的区别是一个将sum数组定义在了主函数外面,另一个将主函数定义在了主函数里面,
对于本题,定义在主函数里面的方法可以过掉大部分的数据,但是在有些情况会突然出现特别大的数据,
这实际上是由于定义在主函数外面,在系统运行时会将数组初始化为0,但定义在主函数内就不一定了,
所以容易出现错误情况。
牢记牢记牢记:初始化数组记得放外面。

浙公网安备 33010602011771号