[算法材料包]C++前缀和入门

server/2024/9/25 17:20:15/

啊,哈喽,小伙伴们大家好。我是#Y清墨,今天呐,我要介绍的是前缀和入门。 

导语

我们先来思考一个问题:小帅有n个编号为1~n的帐号,每个帐号里装有ci个文章,求从a至b的帐号里的文章数量和。

一.前缀和

(1)解题一

没学前缀和的小伙伴肯定会这样打。

#include<bits/stdc++.h>
using namespace std;
int n,a,b,c[101],ans=0,i;
int main(){cin>>n>>a>>b;for(i=1;i<=n;i++){cin>>c[i];if(i>=a&&i<=b)ans += c[i];}cout<<ans;return 0;
}

这种算法要得出一个区间之和,这题只需要取一次区间值,时间复杂度需要 O(n),但是呢,啊,如果 2 次,4 次,1000 次,数据再一大,暴力算法1000%会超时的,这时,前缀和的优势就体现出来了因为它会取区间之和只需要 O(1)。

(2)前缀和详讲

讲解之前呢,先讲一下前缀和。

概念:前缀和就是数组的前 i 项之和。

很明显,能画一个表格。

下标123456
a数组112358
b数组12471220

 啊结合for循环那也是简简单单,易如反掌。

for(i=1;i<=n;i++)
{cin>>a[i];b[i]=b[i-1]+a[i];
}

二.前缀和题目

(1)所有奇数长度子数组的和

题目描述

给你一个正整数数组 a ,请你计算所有可能的奇数长度子数组的和。

子数组的定义为:原数组中的一个连续子序列。

请你输出数组 a 中所有奇数长度子数组的和。

输入格式

第 1 行:1 个正整数 N,不超过 10000 。

第 2 行:N 个整数,范围 [1,10000] 。

输出格式

输出一个整数。

样例

输入数据 1

5
1 4 2 5 3

输出数据 1

58

样例解释

所有奇数长度子数组和它们的和为:

[1] = 1,[4] = 4,[2] = 2,[5] = 5,[3] = 3,[1,4,2] = 7,[4,2,5] = 11,[2,5,3] = 10

,[1,4,2,5,3] = 15,我们将所有值求和得到 1 + 4 + 2 + 5 + 3 + 7 + 11 + 10 + 15 = 58。

#include<bits/stdc++.h>
using namespace std;
long long n,a[10001];
int main(){scanf("%lld",&n);for(int i=1;i<=n;i++){int x;scanf("%lld",&x);a[i]=a[i-1]+x;}long long cnt=0;for(int i=1;i<=n;i=i+2)//i+2是因为是奇数长度{for(int j=1;j<=n-i+1;j++){int r=j+i-1;//指针cnt+=a[r]-a[j-1];}}cout<<cnt;return 0;
}

(2)有多少个数字1 

题目描述

小明很喜欢喜欢数字 1 ,他想研究两个整数之间所有整数出现了多少个数字 1 。

现在他想求 n 次,a 和 b 之间(包含 a 和 b )的所有整数的 1 出现的次数,聪明的你能够帮帮小明吗?

输入格式

第 1 行 1 个整数 n ( 1 <= n <= 1000000 )。

下面有 n 行,每行 2 个整数 a 和 b ( 1 <= a , b <= 1000000 )。

输出格式

n 个整数,每个数一行,对应 n 个询问。

样例

输入数据 1

3
1 10
10 20
5 9

输出数据 1

2
11
0
#include<bits/stdc++.h>
using namespace std;
long long a,b,sz[1000001],n,t,s;
int main(){for(int i=1;i<=1000001;i++)//赋值{t=i;while(t!=0){if(t%10==1)s++;t=t/10;}sz[i]=sz[i-1]+s;s=0;}scanf("%lld",&n);for(int i=1;i<=n;i++){scanf("%lld" "%lld",&a,&b);//计算if(a>b) swap(a,b);printf("%lld\n",sz[b]-sz[a-1]);}return 0;
}

 预告

【类型商店】字符字符串


http://www.ppmy.cn/server/27060.html

相关文章

【Python快速上手(九)】

目录 Python快速上手&#xff08;九&#xff09;Python3 推导式、命名空间Python3 推导式1. 列表推导式2. 字典推导式3. 集合推导式4. 生成器表达式注意事项 Python3 命名空间1. 内置命名空间&#xff08;Built-in Namespace&#xff09;2. 全局命名空间&#xff08;Global Nam…

springboot配置WebMvcConfigurationSupport

一、在spring里有四个mvc配置类 1、mvc配置类 WebMvcConfigurer WebMvcConfigurerAdapter WebMvcConfigurationSupport WebMvcAutoConfiguration 2、WebMvcConfigurer为接口 3、WebMvcConfigurerAdapter是WebMvcConfigurer的实现类&#xff0c;且大部分为空方法&#xff0c;…

FreeLearning 安全译文集翻译完毕

高级基础设施渗透测试高度安全环境下的高级渗透测试AWS 渗透测试为高级渗透测试构建虚拟渗透实验室Python 高效渗透测试BurpSuite 秘籍Python 渗透测试实用指南渗透测试即时入门IOT 渗透测试秘籍渗透测试学习指南Python 渗透测试学习指南Python Web 渗透测试学习手册精通机器学…

Pycharm新建工程时使用Python自带解释器的方法

Pycharm新建工程时使用Python自带解释器的方法 新建Project时最好不要新建Python解释器&#xff0c;实践证明&#xff0c;自己新建的Python解释器容易出现各种意想不到的问题。 那么怎样使用Python安装时自带的解释器呢&#xff1f; 看下面的三张截图大家就清楚了。 我的Pyth…

前端项目学习记录3:mock接口

1.下载mock接口 pnpm i vite-plugin-mock 2.配置vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from "path"; //引入svg需要用到的插件 import { createSvgIconsPlugin } from vite-plugin-svg-icons //mock插…

C# Windows Forms 应用程序中连接到 数据库

要在 C# Windows Forms 应用程序中连接到 SQL Server&#xff0c;你需要使用 .NET Framework 的 System.Data.SqlClient 命名空间&#xff0c;这个命名空间提供了连接和操作 SQL Server 的工具。以下是一个简单的示例&#xff0c;展示如何建立连接并执行 SQL 查询。 步骤 1: 添…

创建SpringBoot和RabbitMQ的整合项目

文章目录 创建SpringBoot和RabbitMQ的整合项目首先快速创建一个maven项目引入SpringBoot整合rabbitMQ的依赖在src/main目录下创建resources目录并引入配置文件写消息发送者MessageSender写消息接收者MessageReceiver写RabbitMQConfig配置类写SpringBoot启动主类CommandLineRunn…

ChatGPT的AI“记忆”可以记住付费客户的偏好

通过记住有关 ChatGPT Plus 订阅者的详细信息&#xff0c;OpenAI 的聊天机器人添加了更多个人助理风格的功能 OpenAI 在今年二月宣布了 “记忆 ”功能&#xff0c;该功能允许 ChatGPT 更永久地存储查询、提示和其他自定义功能。当时&#xff0c;只有 “一小部分 ”用户可以使用…