当前位置: 首页 > news >正文

[蓝桥杯] 二分与前缀和习题练习

 

文章目录

一、二分查找习题练习

1、1 数的范围

1、1、1 题目描述

1、1、2 题解关键思路与解答

1、2 机器人跳跃问题

1、2、1 题目描述

1、2、2 题解关键思路与解答

1、3 四平方和

1、3、1 题目描述

1、3、2 题解关键思路与解答

二、前缀和习题练习

2、1 前缀和

2、1、1 题目描述

2、1、2 题解关键思路与解答

2、2 子矩阵的和

2、2、1 题目描述

2、2、2 题解关键思路与解答

三、总结


标题:蓝桥杯——二分与前缀和习题练习

作者:@Ggggggtm

寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景

  又来更新了。二分与前缀和是蓝桥杯比较常考的内容,所以我们要多加练习这方面的习题。二分与前缀和的难度相对来说不算大,我们应该掌握其关键要点。

一、二分查找习题练习

1、1 数的范围

1、1、1 题目描述

题目来源:模板题,AcWing

题目难度:简单

题目描述:

  给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。

  对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。

  如果数组中不存在该元素,则返回 -1

输入格式:

  第一行包含整数 n 和 q,表示数组长度和询问个数。

  第二行包含 n 个整数(均在 1∼10000 范围内),表示完整数组。

  接下来 q 行,每行包含一个整数 k,表示一个询问元素。

输出格式:

  共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。

  如果数组中不存在该元素,则返回 -1

数据范围:

1≤n≤100000
1≤q≤10000
1≤k≤10000

输入样例:

6 3
1 2 2 3 3 4
3
4
5

输出样例:

3 4
5 5
-1 -1

1、1、2 题解关键思路与解答

  简单总结上述题目,就是让我们找出要求相同的数的左右区间。也就是我们需要找出要求的数的左边界与右边界。因为题目中描述的是有序的,所以我们在这里用二分就可以很容易找到题目所要求的左右边界。我们直接看代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>using namespace std;int n,m;
const int N=100010;
int arr[N];int main()
{cin>>n>>m;for(int i=0;i<n;i++)scanf("%d",&arr[i]);while(m--){int k;scanf("%d",&k);int l=0,r=n-1;while(l<r){int mid=l+r>>1;if(arr[mid]>=k)r=mid;elsel=mid+1;}if(arr[l]==k){cout<<l<<' ';r=n-1;while(l<r){int mid=l+r+1>>1;if(arr[mid]<=k)l=mid;elser=mid-1;}cout<<l<<endl;}else{cout<<"-1 -1"<<endl;}}return 0;
}

1、2 机器人跳跃问题

1、2、1 题目描述

题目来源:今日头条2019笔试题

题目难度:简单

题目描述:

  机器人正在玩一个古老的基于 DOS 的游戏。

  游戏中有 N+1 座建筑——从 0 到 N 编号,从左到右排列。

  编号为 0 的建筑高度为 0 个单位,编号为 i 的建筑高度为 H(i)个单位。

  起初,机器人在编号为 0 的建筑处。

  每一步,它跳到下一个(右边)建筑。

  假设机器人在第 k 个建筑,且它现在的能量值是 E,下一步它将跳到第 k+1个建筑。

  如果 H(k+1)>E,那么机器人就失去 H(k+1)−E的能量值,否则它将得到 E−H(k+1)的能量值。

  游戏目标是到达第 N 个建筑,在这个过程中能量值不能为负数个单位。

  现在的问题是机器人至少以多少能量值开始游戏,才可以保证成功完成游戏?

输入格式:

  第一行输入整数 N。

  第二行是 N 个空格分隔的整数,H(1),H(2),…,H(N) 代表建筑物的高度。

输出格式:

  输出一个整数,表示所需的最少单位的初始能量值上取整后的结果。

数据范围:

  1≤N,H(i)≤10e5

输入样例1:

5
3 4 3 2 4

输出样例1:

4

输入样例2:

3
4 4 4

输出样例2:

4

输入样例3:

3
1 6 4

输出样例3:

3

1、2、2 题解关键思路与解答

  这个题我们可以用二分加枚举来计算,时间复杂度为O(n*logn),最大数据为1e5,也是可以通过的。具体就是,我们可以二分能量,然后通过能量再去枚举看是否可以通过。这里需要注意的是要整形溢出的问题。

#include<iostream>
#include<cstdio>using namespace std;int n;
const int N=100010;
int a[N];bool jump(int e)
{for (int i = 0; i < n; i ++ ){//e = e * 2 - a[i];//if (e < 0) return false;if(a[i]>e)e-=(a[i]-e);elsee+=(e-a[i]);if (e >= 1e5)return true;if(e<0)return false;}return true;
}
int main()
{scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);}int min=0,max=100010;while(min<max){int mid=min+max>>1;if(jump(mid))max=mid;elsemin=mid+1;}cout<<min<<endl;return 0;
}

1、3 四平方和

1、3、1 题目描述

题目来源:第七届蓝桥杯省赛C++A/B组,第七届蓝桥杯省赛JAVAB/C组

题目难度:中等

题目描述:

  四平方和定理,又称为拉格朗日定理:

  每个正整数都可以表示为至多 4 个正整数的平方和。

  如果把 0 包括进去,就正好可以表示为 4 个数的平方和。

  比如:

  对于一个给定的正整数,可能存在多种平方和的表示法。

  要求你对 4 个数排序:

  0≤a≤b≤c≤d,并对所有的可能表示法按 a,b,c,d为联合主键升序排列,最后输出第一个表示法。

输入格式:

  输入一个正整数 N。

输出格式:

  输出4个非负整数,按从小到大排序,中间用空格分开。

数据范围

  0<N<5∗1e6。

输入样例:

5

输出样例:

0 0 1 2

1、3、2 题解关键思路与解答

  由于题目给出的数据范围较大,所以我们在这里不能用暴力四层for循环来求解。我们可以先求出c和d两数的平方和,再把这两个数的平方和存起来并且排序。再去求a和b的平方和,通过二分去找已经算好的c和d的平方和,看是否满足条件。那我们如何保证0≤a≤b≤c≤d呢?我们再求和的时候是从大到小的,一旦找到解就返回即可。我们结合代码一起理解一下:

#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>using namespace std;const int N = 2500010;struct Sum
{int s, c, d;bool operator< (const Sum &t)const{if (s != t.s) return s < t.s;if (c != t.c) return c < t.c;return d < t.d;}
}sum[N];int n, m;int main()
{cin >> n;for (int c = 0; c * c <= n; c ++ )for (int d = c; c * c + d * d <= n; d ++ )sum[m ++ ] = {c * c + d * d, c, d};sort(sum, sum + m);for (int a = 0; a * a <= n; a ++ )for (int b = a; a * a + b * b <= n; b ++ ){int t = n - a * a - b * b;int l = 0, r = m - 1;while (l < r){int mid = l + r >> 1;if (sum[mid].s >= t) r = mid;else l = mid + 1;}if (sum[l].s == t){printf("%d %d %d %d\n", a, b, sum[l].c, sum[l].d);return 0;}}return 0;
}

二、前缀和习题练习

2、1 前缀和

2、1、1 题目描述

题目来源:《算法竞赛进阶指南》

题目难度:简单

题目描述:

  输入一个长度为 n 的整数序列。

  接下来再输入 m 个询问,每个询问输入一对 l,r。

  对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。

输入格式:

  第一行包含两个整数 n 和 m。

  第二行包含 n 个整数,表示整数数列。

  接下来 m 行,每行包含两个整数 l 和 r,表示一个询问的区间范围。

输出格式:

  共 m 行,每行输出一个询问的结果。

数据范围:

  1≤l≤r≤n,
  1≤n,m≤100000,
  −1000≤数列中元素的值≤1000

输入样例:

5 3
2 1 3 6 4
1 2
1 3
2 4

输出样例:

3
6
10

2、1、2 题解关键思路与解答

   题目要求是求一段区间的和。数组的元素个数和询问次数的数据范围为0到1e5,暴力循环求解是不行。这里我们可以用到前缀和,使的求一段区间的和的值从O (N)的时间复杂度优化到了O(1)。我们直接看代码:

#include<iostream>
#include<cstdio>using namespace std;const int N=100010;int n,m;int a[N],s[N];int main()
{cin>>n>>m;for(int i=1;i<=n;i++){scanf("%d",&a[i]);s[i]=s[i-1]+a[i];}while(m--){int l,r;scanf("%d%d",&l,&r);printf("%d\n",s[r]-s[l-1]);}return 0;
}

2、2 子矩阵的和

2、2、1 题目描述

题目来源:《算法竞赛进阶指南》

题目难度:简单

题目描述:

  输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每个询问包含四个整数 x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。

  对于每个询问输出子矩阵中所有数的和。

输入格式:

  第一行包含三个整数 n,m,q。

  接下来 n 行,每行包含 m 个整数,表示整数矩阵。

  接下来 q 行,每行包含四个整数 x1,y1,x2,y2,表示一组询问。

输出格式:

  共 q 行,每行输出一个询问的结果。

数据范围:

  1≤n,m≤1000,
  1≤q≤200000,
  1≤x1≤x2≤n,
  1≤y1≤y2≤m
  −1000≤矩阵内元素的值≤1000

输入样例:

3 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4

输出样例:

17
27
21

2、2、2 题解关键思路与解答

  该题的题录与前缀和思路大致相同,只不过这道题求的前缀和变成了二位的前缀和。建议画图,利用容斥原理,仔细分析一下即可。相对还是较为简单的。

#include<iostream>
#include<cstdio>using namespace std;const int N=1010;int a[N][N],s[N][N];int n,m,q;int main()
{cin>>n>>m>>q;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&a[i][j]);s[i][j]=s[i][j-1]+s[i-1][j]-s[i-1][j-1]+a[i][j];}while(q--){int x1,x2,y1,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);printf("%d\n",s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1]);}return 0;
}

三、总结

  通过上面的习题练习,我们发现二分和前缀和的思想很简单。同时,我们也要掌握上面的二分和前缀和的思路和方法。在很多情况下,会给我们带来很大的便利。

  二分和前缀和的练习就到这里,希望以上内容对你有所帮助。

相关文章:

[蓝桥杯] 二分与前缀和习题练习

文章目录 一、二分查找习题练习 1、1 数的范围 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 机器人跳跃问题 1、2、1 题目描述 1、2、2 题解关键思路与解答 1、3 四平方和 1、3、1 题目描述 1、3、2 题解关键思路与解答 二、前缀和习题练习 2、1 前缀和 2、1、1 题目描述…...

SpringMvc中HandlerAdapter组件的作用

概述 我们在使用springMVC时&#xff0c;都知道其中不仅包含handlerMapping组件还包含handlerAdapter组件&#xff0c;为什么呢&#xff1f; springMVC请求流程图 HandlerAdapter组件使用了适配器模式 适配器模式的本质是接口转换和代码复用&#xff0c;这里使用适配器模式的…...

FreeRTOS优先级翻转

优先级翻转优先级翻转&#xff1a;高优先级的任务反而慢执行&#xff0c;低优先级的任务反而优先执行优先级翻转在抢占式内核中是非常常见的&#xff0c;但是在实时操作系统中是不允许出现优先级翻转的&#xff0c;因为优先级翻转会破坏任务的预期顺序&#xff0c;可能会导致未…...

服务器部署—部署springboot之Linux服务器安装jdk和tomcat【建议收藏】

我是用的xshell连接的云服务器&#xff0c;今天想在服务器上面部署一个前后端分离【springbootvue】项目&#xff0c;打开我的云服务器才发现&#xff0c;过期了&#xff0c;然后又买了一个&#xff0c;里面环境啥都没有&#xff0c;正好出一期教程&#xff0c;方便大家也方便自…...

golang项目----家庭收支记账软件

家庭收支记账软件实现基本功能(先使用面向过程&#xff0c;后面改成面向对象)项目代码实现改进面向过程源码面向对象源码utils包中main包中实现基本功能(先使用面向过程&#xff0c;后面改成面向对象) 编写文件TestMyAccount.go完成基本功能 功能一&#xff1a;先完成可以显示…...

中国LNG市场投资机会研究

中国LNG市场投资机会研究中国LNG市场是一个具有巨大潜力和发展机遇的市场&#xff0c;尤其是在政府大力推动清洁能源发展的背景下&#xff0c;LNG市场投资机会正在不断扩大。首先&#xff0c;政府大力支持LNG市场的发展。政府实施的“十三五”规划将LNG作为清洁能源的重要来源&…...

Elasticsearch:索引数据是如何完成的

在我在之前的文章 “Elasticsearch&#xff1a;彻底理解 Elasticsearch 数据操作” 文章中&#xff0c;我详细地描述了如何索引数据到 Elasticsearch 中。在今天的文章中&#xff0c;我想更进一步来描述这个流程。 Elasticsearch 是一个非常强大和灵活的分布式数据系统&#x…...

处理器管理

处理器状态处理器管理是操作系统中重要组成部分&#xff0c;负责管理、调度和分配计算机系统的重要资源——处理器&#xff0c;并控制程序执行由于处理器管理是操作系统最核心的部分&#xff0c;无论是应用程序还是系统程序&#xff0c;最终都要在处理器上执行以实现其功能&…...

跟着我从零开始入门FPGA(一周入门系列)第五

5、同步和异步设计 前面已有铺垫&#xff0c;同步就是与时钟同步。 同步就是走正步&#xff0c;一二一&#xff0c;该迈哪个脚就迈那个脚&#xff0c;跑的快的要等着跑的慢的。 异步就是搞赛跑&#xff0c;各显神通&#xff0c;尽最大力量去跑&#xff0c;谁跑得快&#xff0c;…...

【第42天】Arrays.sort 与 Collections.sort 应用 | 整形数组与集合的排序

本文已收录于专栏&#x1f338;《Java入门一百练》&#x1f338;学习指引序、专栏前言一.sort函数二、【例题1】1、题目描述2、解题思路3、模板代码4、代码解析二、【例题1】1、题目描述2、解题思路3、模板代码4、代码解析三、推荐专栏序、专栏前言 本专栏开启&#xff0c;目的…...

LeetCode第334场周赛

2023.2.26LeetCode第334场周赛 A. 左右元素和的差值 思路 前缀和后缀和 代码 class Solution { public:vector<int> leftRigthDifference(vector<int>& nums) {int n nums.size();vector<int> l(n), r(n), ans(n);for (int i 1; i < n; i )l[…...

基于深度学习的三维重建网络PatchMatchNet(三):PatchMatchNet配置及代码主要运行流程

目录 1.PatchMatchNet环境配置 2. PatchMatchNet的大致执行流程(eval.py) 2.1 深度图的保存...

【一天一门编程语言】设计一门编程语言,给出基础语法代码示例,SDK设计。

文章目录设计一门编程语言&#xff0c;给出基础语法代码示例&#xff0c;SDK设计。一、编程语言设计1.1 语言名称1.2 数据类型1.3 基本运算符1.4 控制语句二、SDK设计2.1 基础库2.2 第三方库三、例子用 Mango 这门语言实现斐波那契数列。基础语法代码示例SDK 设计使用 Mango 语…...

ubuntu 下 python 安装 venv

ubuntu 下 python 安装 venv1.首先&#xff0c;确保您的系统已安装 Python3 和 pip3&#xff0c;如果没有安装&#xff0c;可以使用以下命令安装&#xff1a;2. 接着&#xff0c;安装 virtualenv 包&#xff0c;使用以下命令&#xff1a;3.创建 Python 虚拟环境&#xff0c;使用…...

HTML#1快速入门

一. 简介HTML是一门语言, 所有的网页都是用HTML编写的HTML(Hyper Text Markup Language): 超文本(超越了文本限制,除了文字信息还可以定义图片,音频,视频等)标记语言(有标签构成的语言)W3C标准: 网页主要由三部分组成(1) 结构: HTML(2) 表现: CSS(3) 行为: JavaScript二. 快速入…...

【MySQL】事务隔离级别是怎么实现的?

事务隔离级别是怎么实现的&#xff1f; 四种隔离级别具体的实现方式 对于「读未提交」&#xff1a;直接读取最新的数据就好。对于「串行化」&#xff1a;通过加读写锁的方式来避免并行访问。对于「读提交」和「可重复读」&#xff1a;通过 Read View 来实现&#xff0c;主要区…...

JSP网上书店系统用myeclipse定制开发mysql数据库B/S模式java编程计算机网页

一、源码特点 JSP 网上书店系统 是一套完善的系统源码&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。研究的基本内容是基于网上书店系 统&#xff0c;使用JSP作为页面开发工具。Web服务的运…...

配置 Haproxy 负载均衡群集

配置 haproxy 负载均衡群集 &#x1f3c6;荣誉认证&#xff1a;51CTO博客专家博主、TOP红人、明日之星&#xff1b;阿里云开发者社区专家博主、技术博主、星级博主。 &#x1f4bb;微信公众号&#xff1a;微笑的段嘉许 &#x1f4cc;本文由微笑的段嘉许原创&#xff01; &#…...

计算机网络笔记 | 第一章:计算机网络概述(1.1-1.4小节知识点整理)

从专栏将讲述有关于计算机网络相关知识点&#xff0c;如果有想学习Java的小伙伴可以点击下方连接查看专栏&#xff0c;还有JavaEE部分 本专栏地址&#xff08;持续更新中&#xff09;&#xff1a;&#x1f525;计算机网络 MyBatis&#xff1a;✍️MyBatis Java入门篇&#xff1…...

Flutter3引用原生播放器-Android篇

接上篇&#xff1a;Flutter3引用原生播放器-IOS(Swift)篇 安卓端原生播放器的接入思路与ios基本一致&#xff0c;所以本篇就不废话了&#xff0c;直接上代码&#xff1a; 创建插件VideoViewPlugin实现FlutterPlugin&#xff1a; package io.flutter.plugins.videoplayer;imp…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...