[蓝桥杯] 二分与前缀和习题练习
文章目录
一、二分查找习题练习
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时,都知道其中不仅包含handlerMapping组件还包含handlerAdapter组件,为什么呢? springMVC请求流程图 HandlerAdapter组件使用了适配器模式 适配器模式的本质是接口转换和代码复用,这里使用适配器模式的…...

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

服务器部署—部署springboot之Linux服务器安装jdk和tomcat【建议收藏】
我是用的xshell连接的云服务器,今天想在服务器上面部署一个前后端分离【springbootvue】项目,打开我的云服务器才发现,过期了,然后又买了一个,里面环境啥都没有,正好出一期教程,方便大家也方便自…...

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

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

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

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

跟着我从零开始入门FPGA(一周入门系列)第五
5、同步和异步设计 前面已有铺垫,同步就是与时钟同步。 同步就是走正步,一二一,该迈哪个脚就迈那个脚,跑的快的要等着跑的慢的。 异步就是搞赛跑,各显神通,尽最大力量去跑,谁跑得快,…...

【第42天】Arrays.sort 与 Collections.sort 应用 | 整形数组与集合的排序
本文已收录于专栏🌸《Java入门一百练》🌸学习指引序、专栏前言一.sort函数二、【例题1】1、题目描述2、解题思路3、模板代码4、代码解析二、【例题1】1、题目描述2、解题思路3、模板代码4、代码解析三、推荐专栏序、专栏前言 本专栏开启,目的…...

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

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

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

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

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

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

计算机网络笔记 | 第一章:计算机网络概述(1.1-1.4小节知识点整理)
从专栏将讲述有关于计算机网络相关知识点,如果有想学习Java的小伙伴可以点击下方连接查看专栏,还有JavaEE部分 本专栏地址(持续更新中):🔥计算机网络 MyBatis:✍️MyBatis Java入门篇࿱…...

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

SerenityOS 操作系统类 Unix 操作系统
创建于2018年的SerenityOS是一个类似Unix的操作系统,但是带有图形化界面,适合X86台式计算机,,其界面类似90 年代的Win98/NT。几乎由一个人完成额操作系统。这几天其Web浏览器通过了 Acid3 浏览器。 Kernel features 具有抢占式多…...

Bean作用域和生命周期
目录 Bean作用域的例子 作用域定义 Bean的六种作用域 设置作用域 Spring的执行过程和Bean的生命周期 Spring的主要执行流程 Bean的生命周期 在上篇博客中我们使用Spring存储和获取Bean,因此Bean是Spring中最重要的资源,今天这篇博客就深入了解Bean对象 Bean作用域的例子 …...

STM32笔记
目录 1.1. 预备阶段 1.2. 单片机介绍 2. 初识STM32 2.1. STM32 1.1. 预备阶段 1.2. 单片机介绍 1.2.1. 单片机是什么 单片微型计算机(Single Chip Microcomputer)简称为单片机(Microcontrollers),也称为微控制单元(Microcontroller Uni…...

【论文阅读】基于LevelDB的分布式数据库研究
基于LevelDB的分布式数据库研究 基于LevelDB的分布式数据库的研究与实现 - 中国知网 (cnki.net) 实现了什么? 基于键值型NoSQL数据库LevelDB,并与数据一致性算法Raft、 数据分片和负载均衡相结合,设计并实现基于LevelDB的分布式数据库。 主要…...

JavaScript高级 Iterator Generator
1. Iterator 1. JavaScript迭代器协议 在JavaScript中,迭代器也是一个具体的对象,这个对象需要符合迭代器协议(iterator protocol): ◼ 迭代器协议定义了产生一系列值(无论是有限还是无限个)…...

数字IC手撕代码--乐鑫科技(次小值与次小值出现的次数)
前言:本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。目录如下:1.数字IC手撕代码-分频器(任意偶数分频)2.数字IC手撕代…...

JavaScript DOM和BOM
目录 查找html元素 1.通过id 2.通过标签名 3.通过类名 DOM 1.创建动态的HTML内容 2.修改元素内容 3.改变HTML属性 4.改变css样式 DOM事件 DOM节点 1.添加HTML元素 2.删除HTML元素 浏览器对象 1.Window对象 2.Screen对象 3.History对象 4.Location对象 5.Navi…...

JUC并发编程(二)
一、过时方法 一些不推荐使用的方法已经过时,容易破坏同步代码块,使对象的锁得不到释放,进而造成线程死锁 二、守护线程 默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程…...

Python控制CANoe使能TestCase
前面介绍了多种CANoe配置下的dbc文件添加,常见的配置我们能够常用的就是testcase的使能和环境变量的设置,针对于环境变量的问题,我们下次再进行详聊,今天主要聊一下测试脚本的使能。在做这块之前,我们第一步就需要了解我们的测试脚本的层级是都包含有哪些? 一、测试脚本结…...

sql的执行顺序
一.前言 在我们世家开发中,我们少不了和数据库打交道, 我们的持久层是与数据库打交道的, 少不了要用sql语句来请求数据库的数据, 前台(前端页面)请求到-->控制器(接口层)-->service(业务层)-->mapper或dao(持久层) 简图: 在持久层我们的sql是怎么执行的, 它的执行顺…...