黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)C题 (前缀和)学习笔记

第一次打训练赛,还是太嫩了,知识点不够。

题目:
在这里插入图片描述
奉上当时自己写的代码。(用了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)。奥利给。

猜你喜欢

转载自blog.csdn.net/weixin_51765822/article/details/113075231