第一次打训练赛,还是太嫩了,知识点不够。
题目:
奉上当时自己写的代码。(用了3个for()循环,超时)。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,m;
int b1,b2;
while (cin>>n>>m)
{
int a[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<m;i++)
{
int sum=0;
cin>>b1>>b2;
for(int i=b1;i<=b2;i++)
{
sum=a[i-1]+sum;
}
cout<<sum<<endl;
}
}
return 0;
}
看了别人的题解后写的代码。
#include<bits/stdc++.h>//C++万能头文件
using namespace std;
long long sum[1000005];
int main()
{
long long n,m,s;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
cin>>s;
sum[i]=sum[i-1]+s;//一维前缀和
}
int i,j;
for(int i=1;i<=m;i++){
scanf("%d %d",&i,&j);
// //第1位到第j位的和减去第一位到第i-1位的和,得到第i位到第j位的和。
printf("%d\n",sum[j]-sum[i-1]);
}
return 0;
}
//
学了一个新的知识点:前缀和。
一维前缀和
其实可以把它理解为数学上的一维数列的前n项和。
对于一个给定的数列 A,他的前缀和数列 S 是通过递推能求出来的基本信息之一:
S[i] = ∑A[j] ( j ∈ [1,i] ) 一个部分和,即数列 A 某个下表区间内的数的和,也可以表示为前缀和相减的形式:sum(l,r) = ∑A[i] ( i ∈ [l,r] ) = S[r] - S[l-1]。
代码:
int sum[1] = a[1];
for(int i=2;i<=n;i++){
sum[i] = sum[i-1] + a[i];
}
用了前缀和,oj都说行(AC)。奥利给。