蓝桥杯冲刺:一维前缀和

news2025/5/15 10:40:02

系列文章目录

蓝桥杯系列:一维前缀和


文章目录

  • 系列文章目录
  • 前言
  • 一、暴力的写法:
  • 二、一维前缀和的模板:
    • 具体实现:
  • 三、具体例题:求和
    • 1.题目参考:
    • 2.以下是具体代码实现:
  • 总结


前言

    上次我介绍了一下模拟和枚举类的题目,这次我想给大家介绍一种必会的思想,就是一维前缀和,因为假设我们要确定一个区间的和,我们每次确定一个范围就是遍历一次,时间复杂度有可能会很高,而我们如果构建出来前缀和数组的话就方便很多了,下面我们来看具体的:


 前缀和是以空间换时间

一、暴力的写法:

        先给大家来看一种暴力的写法,这种相信大家只要思路是对的应该都可以直接写出来。

           

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();      // 数组长度
        int q = scan.nextInt();      // 查询次数
        int[] arr = new int[n + 1];  // 假设数组从索引1开始存储(方便输入)

        // 读取数组元素(1-based)
        for (int i = 1; i <= n; i++) {
            arr[i] = scan.nextInt();
        }

        // 处理每个查询
        for (int j = 0; j < q; j++) {
            int l = scan.nextInt(); // 区间左端点
            int r = scan.nextInt(); // 区间右端点
            
            // 暴力累加区间和
            int sum = 0;
            for (int k = l; k <= r; k++) {
                sum += arr[k];
            }
            System.out.println(sum);
        }

        scan.close();
    }
}

   

这种方式

  1. 超时风险:​ 当 n = 1e5 且 q = 1e5 时,总操作次数高达 1e10,远超程序的时间限制(通常 1秒内只能处理约 1e8 次操作)。
  2. 重复计算:​ 相同区间多次查询时,暴力法会重复计算,而前缀和只需一次预处理。

二、一维前缀和的模板:

        

       具体实现:

       

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
         int t = 1;
         while(t>0){
              solve(scan);
              t--;
         }

        scan.close();
    }

    public static void solve(Scanner scan){
     
           int n = scan.nextInt();
           int q = scan.nextInt();
          int[] arr = new int[n+1];
          int[] pre = new int[n+1];
           arr[0] = 0;
           pre[0] = 0;
            for(int i = 1;i<=n;i++){
                 arr[i] = scan.nextInt();
              pre[i] = pre[i-1]+arr[i];//将前缀和确定
              }  
            for(int j = 0;j<q;j++){
               int l = scan.nextInt();
               int r = scan.nextInt();

               System.out.println(pre[r]-pre[l-1]);
            }       


     }


}

      这个就是创建出来了一个前缀和数组,然后开始进行赋值。   

        下面我们通过这个画像来帮大家形象的理解一下:

                 

   这个就是用画图来具体的给大家来呈现的方式。

三、具体例题:求和  

    题目参考:

 

     

这也是一道有关前缀和的题,我们分析题可以发现一些规律

    a1(a2+....+an) +a2(a3+....+an)+a3(a4+....+an)

      所以通项就是:ai(a(i+1)+.....+a(n))

这道题还有一种考点,就是要用合适的数据类型来判断,因为S的值可能会超过int类型,int类型大概范围是2*10的9次方,而long的大概范围是9*10的18次方,这个很明显会超过int范围,所以所以sum应该定义为long类型。而arr[i]*(pre[n]-pre[i])也有可能溢出,所以我们也要把arr[i]转换为long类型的,防止出错。
   

以下是具体代码实现:

    

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
      int n = scan.nextInt();
      System.out.println(sum(n,scan));
        scan.close();
    }
     //这也是一道有关前缀和的题,我们分析题可以发现一些规律
      //a1(a2+....+an) +a2(a3+....+an)+a3(a4+....+an)
        //所以通项就是:ai(a(i+1)+.....+a(n))
          
      public static long sum(int n,Scanner scan){
            int[] arr = new int[n+1];
            int[] pre = new int[n+1];
            arr[0] = 0;
            pre[0] = 0;                
               for(int i = 1;i<=n;i++){
                   arr[i] = scan.nextInt();
                   pre[i] = pre[i-1]+arr[i];//计算前缀和的和                     
                }
                long sum = 0;
             for(int i = 1;i<n;i++){
                 
                 sum += (long)arr[i]*(pre[n]-pre[i]);
             }

               return sum;
        }





}

 对于一维前缀和数组来说:

时间复杂度大幅降低

  • 暴力法:每次查询需要遍历区间 [l, r],时间复杂度为 O(n)。
  • 前缀和:预处理 O(n),之后每次查询只需 O(1)。

总结

  以上就是今天要讲的内容,其实前缀和就像一个基本的组件可以作为其他算法的组件,像动态规划等等,下面我们讲dp的时候我也会给大家更新的,接下来我会一直给大家更新蓝桥杯的算法题的,大家一起加油,积极向上就完了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2327248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu24.04-中文输入法的切换

Ubuntu24.04在安装后自带中文全拼输入法。。 根据官方的说明&#xff0c;需使用 shift super 空格 切换输入法&#xff0c;但在之前使用windows或者ubuntu的早些版本&#xff0c;多使用 Ctrl 空格 的方式切换输入法&#xff0c;本文就介绍如何进行输入法快捷键切换的配置&a…

技术回顾day3

1.获取文件信息、获取视频信息 走的都是同一个方法&#xff1a;baseController里面的getFile。 在getFile方法里面进行判断文件的类型&#xff0c;判断是不是m3u8类型或者ts类型做一些额外的处理。 获取信息底层就是读取文件&#xff0c;然后写入response的OutputStream ou…

埃文科技企业AI大模型一体机——昇腾体系+DeepSeek+RAG一站式解决方案

面对企业级市场海量数据资产与复杂业务场景深度耦合的刚需&#xff0c;埃文科技重磅推出基于华为昇腾算力DeepSeek大模型的企业一体机产品&#xff0c;提供DeepSeek多版本大模型一体机选择&#xff0c;为企业提供本地昇腾算力DeepSeek大模型RAG知识库的一体化解决方案&#xff…

JavaWeb开发基础知识-Servlet终极入门指南(曼波萌新版)

(✪▽✪)曼波~~~~&#xff01;欢迎来到Servlet新手村&#xff01;准备好开启Web开发的奇妙冒险了吗&#xff1f;让曼波用最有趣的方式带你飞~ &#x1f680; &#x1f308; 第①章 什么是Servlet&#xff1f; // 本质就是一个Java类&#xff01; public class HelloServlet e…

游戏引擎学习第198天

回顾并为今天的内容设定 今天我们有一些代码需要处理。昨天我们进行了一些调试界面的整合工作&#xff0c;之前我们做了一些临时的、粗糙的操作&#xff0c;将一些东西读进来并放到调试界面中。今天&#xff0c;我们并不打算进行大规模的工作&#xff0c;更多的是对之前的代码…

Walrus 基金会启动 RFP 计划,推动生态发展

Walrus 基金会正式推出 Walrus RFP 提案申请计划&#xff0c;为推动和支持 Walrus 生态的项目提供资金支持。该计划旨在助力构建符合协议使命的解决方案&#xff0c;解锁去中心化和可编程存储的潜力。 无论项目是开发新工具、探索集成&#xff0c;还是提出创新用例&#xff0c…

智能配电箱:重塑未来电力管理的核心枢纽

哇塞&#xff01;智能配电箱可是未来电力管理的超级核心枢纽呀&#xff0c;正以超燃的态势引领着电力行业迈向智能化变革的新征程呢&#xff01;它在众多方面所展现出的独特优势和那广阔无垠的应用前景&#xff0c;简直太令人激动啦&#xff01;下面就来瞧瞧智能配电箱在重塑未…

透过 /proc 看见内核:Linux 虚拟文件系统与 systemd 初始化初探

当我们在终端中输入 ps、top、cat /proc/cpuinfo 等命令时&#xff0c;是否思考过这些信息来自哪里&#xff1f;为什么无需启动任何守护进程&#xff0c;就能实时读取系统负载、内存占用&#xff0c;甚至内核版本&#xff1f;这一切的答案&#xff0c;都藏在 Linux 系统中的一个…

用DrissionPage升级维基百科爬虫:更简洁高效的数据抓取方案

一、原方案痛点分析 原代码使用urllibBeautifulSoup组合存在以下问题&#xff1a; 动态内容缺失&#xff1a;无法获取JavaScript渲染后的页面内容 反爬能力弱&#xff1a;基础请求头易被识别为爬虫 代码冗余&#xff1a;需要单独处理SSL证书验证 扩展性差&#xff1a;难以应…

C++STL——容器-vector(含部分模拟实现,即地层实现原理)(含迭代器失效问题)

目录 容器——vector 1.构造 模拟实现 2.迭代器 模拟实现&#xff1a; ​编辑 3.容量 模拟实现&#xff1a; 4.元素的访问 模拟实现 5.元素的增删查改 迭代器失效问题&#xff1a; 思考问题 【注】&#xff1a;这里的模拟实现所写的参数以及返回值&#xff0c;都是…

严重BUG修复及部分体验问题优化

随着Deepseek APIPython 测试用例一键生成与导出 V1.0.6的试用不断深入&#xff0c;会出现程序异常崩溃的问题。经群友定位&#xff0c;紧急修复了bug&#xff0c;并适当优化部分体验性问题。针对生成的测试用例xlsx文档&#xff0c;可以再次选中该xlsx给大模型进行推理生成新的…

Elasticsearch 证书问题解决

报错信息 javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat org.elasticsearch.client.RestClient. extractAndWrapCause(R…

2023年CIE SCI1区TOP:序列融合麻雀搜索算法ISSA,深度解析+性能实测

目录 1.摘要2.麻雀搜索算法SSA原理3.改进策略3.结果展示4.参考文献5.代码获取 1.摘要 麻雀搜索算法&#xff08;SSA&#xff09;是一种基于麻雀觅食和防捕行为的群体智能算法。然而&#xff0c;基本SSA在迭代过程中&#xff0c;种群多样性逐渐降低&#xff0c;容易陷入局部最优…

配置晟腾910b的PyTorch torch_npu环境

1.【新教程】华为昇腾NPU的pytorch环境搭建 - Lukea - 博客园 1、新建conda环境。 conda create -n pytorch python3.102、在新建好的conda环境中&#xff0c;安装基础的依赖。 pip install attrs cython numpy1.24.0 decorator sympy cffi pyyaml pathlib2 psutil protobuf…

conda 激活环境vscode的Bash窗口

多份conda环境注意事项&#xff0c;当时安装了两个conda环境&#xff0c;miniconda和conda&#xff0c;导致环境总是冲突矛盾。初始化时需要更加注意。 $ C:/Users/a_hal/miniconda3/Scripts/conda.exe init bash能够显示用哪里的conda环境命令执行。 然后直接conda activate…

火山 RTC 引擎 2 ----APPKEY

前篇文章&#xff1a;火山RTC引擎 --一次失望的体验 那个DEMO可以编译运行了&#xff0c;但是功能不能用&#xff0c; 一用就崩溃。 主要原因还是没有APPKEY 一、火山引擎 APPKEY 管理 1、登录后台 账号登录-火山引擎欢迎登录火山引擎&#xff0c;火山引擎是字节跳动旗下的云…

Springboot学习笔记3.28

目录 实战第六课&#xff1a;文章分类开发 新增文章分类&#xff1a; 具体实现&#xff1a; 查询文章分类&#xff1a; 具体实现&#xff1a; 获取文章分类的详情 更新文章分类&#xff1a; 注意点&#xff1a; ​编辑 对校验规则进行分组&#xff1a; 学习时的疑惑…

【CSS3】05-定位 + 修饰属性

本文介绍定位和CSS中的修饰属性。 目录 1. 定位 1.1 相对定位 1.2 绝对定位 1.3 定位居中 1.4 固定定位 1.5 z-index堆叠层级 2. 修饰属性 2.1 垂直对齐方式 vertical-align 2.2 过渡属性 2.3 透明度 opacity 2.4 光标类型 cursor 1. 定位 灵活改变盒子在网页中的位…

如何屏蔽mac电脑更新提醒,禁止系统更新

最烦mac的系统更新提醒了&#xff0c;过几天就是更新弹窗提醒&#xff0c;现在可以直接禁掉了&#xff0c;眼不见心不乱&#xff0c;不然一升级&#xff0c;开发环境全都不能用了&#xff0c;那才是最可怕的&#xff0c;屏蔽的方法也很简单&#xff0c;就是屏蔽mac系统更新的请…

Rclone同步Linux数据到google云盘

文章目录 Rclone管理云存储Rclone安装和使用说明安装rclone配置rclone连接到云盘基本备份命令高级备份选项自动化备份加密备份&#xff08;可选&#xff09;恢复数据常见云存储服务名称注意事项 googleCloud 平台中操作OAuth权限请求页面&#xff08;OAuth同意屏幕&#xff09;…