c++之提高A(前缀和)(第三课)

1.前文

嗯对,在昨天作者写了一些无脑的玩意,大家就当个乐子看。

(顺便放一下网址)

昨天的东西

2.正文

2.1前缀和的介绍

讲一个小故事,虽然纯属虚构:

从前有一个程序员,他想求多个从第个数到第个数的总和。

(假设下面的变量代表的数字全都不超过)

他首先就想到要输入个数,再输入,代表要测几次。

再分别输入和,用一个变量求从第个数到第个数的总和。

代码大致是这样的:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[10005];
int main()
{
	int n,m;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		int sum=0,x,y;
		cin>>x>>y;
		for(int j=x;j<=y;j++)
		{
			sum+=a[j];
		}
		cout<<sum<<endl;
	}
	return 0;
}

听起来很简单,但他发现如果评测机一秒钟测试上限是,和等于或接近时,时间就会超过一秒钟。

为此,他想破脑袋才想出来了一个绝妙的方法------前缀和。

2.2前缀和的代码

他告诉你前缀和是怎么运作的:

假设有一个数组,里面的元素是这样的:

1、3、5、7、9。

让你求第二个到第四个的和。

正常人都会一个个加。可前缀和不是这样。

它在输入数组的时候就开始了。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[10005];
int s[10005];
int main()
{
	int n,m;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
        s[i]=s[i-1]+a[i];
	}
	return 0;
}

此时数组(前缀和数组)里面的值是:

1、4、9、16、25。

求第二个数到第四个数的和就是

cpp 复制代码
s[4]-s[1];

你可能会问,为什么要减1而不是2呢?

他又说:"看看数组里的数!"

一个个加的做法:

3+5+7=15。

前缀和的做法:

16-1=15。

这可快多了!

这个程序员又把下面代码放到评测机里测试:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[10005];
int s[10005];
int main()
{
	int n,m;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
        s[i]=s[i-1]+a[i];
	}
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		cout<<s[x]-s[y-1]<<endl;
	}
	return 0;
}

我去!什么时间超限?不是秒了吗!

至此,故事结束。

(逃!)

新手小白(提高A)

相关推荐
不会就选b2 小时前
算法日常・每日刷题--<贪心>26
数据结构·算法
by209992 小时前
从结构体到对象:正式学习C++类的骨架、封装与this指针
c++·经验分享·学习
2601_962218613 小时前
C语言中三种库的编译和使用方法
开发语言·c++
jimy13 小时前
派生类重写基类虚函数(二):override的作用
开发语言·c++
ebiobiz4 小时前
基于 GD32 Embedded Builder (GEB) 与 Nimmake 的 MCU 工程搭建指南
c++·python·单片机·嵌入式硬件·mcu
hetao17338374 小时前
2026-09-29 hetao1733837 的刷题记录
c++·算法
:mnong4 小时前
几何内核“四大金刚“:ACIS、Parasolid、CGM、Open CASCADE 核心特征深度解析
c++·cad·cax
by209994 小时前
从 malloc/free 到 new/delete:真正理解 C++ 中的内存管理与对象生命周期
c语言·c++·经验分享·动态内存管理
欣欣之王来了5 小时前
AI合规专项:AI算法透明度的合规要求
人工智能·算法