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)

相关推荐
Severus_black20 分钟前
【C++初阶】list使用及相关实现,思路顺滑流畅!
c语言·数据结构·c++·stl·list
武子康1 小时前
H3-World 为何在加载 LoRA 前,先检查导入的代码?
人工智能·深度学习·算法
秋天的怀念_David2 小时前
算法一千零一夜 · 第二十八夜 注册
java·程序人生·算法
敲上瘾2 小时前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
二本咕咕-机械转码2 小时前
FreeRTOS深入解析(八)IPC机制之FromISR详解
数据结构·单片机·链表
旖旎夜光3 小时前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
NEFU_Jyj4 小时前
贝尔数(组合数学)
算法
1-1=04 小时前
C# 数据结构和特殊类型
数据结构·c#·.net·.netcore
希和20274 小时前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
旖旎夜光5 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习