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

蓝桥杯真题05

重新排序

问题描述

给定一个数组 A 和一些查询 Li,Ri 求数组中第 Li 至第 Ri个元素之和。

小蓝觉得这个问题很无聊, 于是他想重新排列一下数组, 使得最终每个查询结果的和尽可能地大。小蓝想知道相比原数组, 所有查询结果的总和最多可以增加多少?

输入格式

输入第一行包含一个整数 n 。

第二行包含 n 个整数 A1,A2,⋯ ,An相邻两个整数之间用一个空格分隔。

第三行包含一个整数 m 表示查询的数目。

接下来 m 行, 每行包含两个整数 Li、Ri相邻两个整数之间用一个空格分隔。

输出格式

输出一行包含一个整数表示答案。

样例输入

5
1 2 3 4 5
2
1 3
2 5

样例输出

4

样例说明

原来的和为 6+14=206+14=20, 重新排列为 (1,4,5,2,3)(1,4,5,2,3) 后和为 10+14=2410+14=24, 增 加了 4。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

思路分析

要想排列前后差值最大,排列前的初始数组我们无法控制,那么就只能想办法改变排列后的数组,让最大的数放在位置出现最多次的地方,进一步来说就是,最大的数要出现最多次,然后依次递减数的大小和位置出现的次数,那么如何去判断哪个位置出现了多少次呢?

不妨定义一个count数组来表示,如果l,r这段被求一次,那么这一段区间内的出现次数就都需要+1,这不正是差分所能实现的吗,因此我们不妨每次count[l]++;count[r+1]--;然后进行差分操作,自然就将每个位置的出现次数计算出了,再将其排序,同时与排序过的原数组对应位置一一相乘,得到的值无疑是最大的,

为什么直接相乘就可以,

因为我们的count数组存的是位置出现次数,我们要求的让他是和最大的数相乘,而较小的那些数刚好会乘以count数组中的0,因此得到的值就是要求。

代码实现

package com.zxy.exam;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;public class _重新排序 {static  int N = 100010;static long[] arr = new long[N];//原数组static long[] count = new long[N];//位置出现次数static long[] b = new long[N];//前缀和数组static int n,m;static long sum1,sum2;static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));static PrintWriter pw = new PrintWriter(System.out);public static void main(String[] args) throws IOException {String s = bf.readLine();n = Integer.parseInt(s);String[] s1 = bf.readLine().split(" ");for (int i = 1; i <= n; i++) {arr[i]=Integer.parseInt(s1[i-1]);//读入数据b[i]=b[i-1]+arr[i];//前缀和}s = bf.readLine();m = Integer.parseInt(s);while(m --> 0){String[] s2 = bf.readLine().split(" ");int l = Integer.parseInt(s2[0]);int r = Integer.parseInt(s2[1]);sum1+=b[r]-b[l-1];count[l]++;count[r+1]--;}for (int i = 1; i <= n; i++) {count[i]+=count[i-1];}Arrays.sort(arr);Arrays.sort(count);//count数组特别大,而且有很多0,因此一定要遍历到最后一位,或者就从最后一位倒着遍历/*int p=N-1;while (count[p]!=0){sum2 += count[p]*arr[p];//更新后的和p--;}*/for (int i = 1; i <= N-1; i++) {sum2+= count[i]*arr[i];}System.out.println(sum2-sum1);}
}

找素数

这道题目很简单找到第1000002个素数,但是素数是蓝桥杯的高频考点,一定要复习一下!

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {int ans = 0;int i = 2;while(true){if (isPrime(i)){ans++;if(ans == 100002){System.out.println(i);return;}}i++;}  }static boolean isPrime(int n) {for(int i = 2; i <= (int) Math.sqrt(n); i++){if (n % i == 0){return false;}}return true;}
}

卡牌

问题描述

这天, 小明在整理他的卡牌。

他一共有 n 种卡牌, 第 i 种卡牌上印有正整数数 i(i∈[1,n]), 且第 i 种卡牌 现有 ai 张。

而如果有 n 张卡牌, 其中每种卡牌各一张, 那么这 nn 张卡牌可以被称为一 套牌。小明为了凑出尽可能多套牌, 拿出了 m 张空白牌, 他可以在上面写上数 i, 将其当做第 i 种牌来凑出套牌。然而小明觉得手写的牌不太美观, 决定第 ii 种牌最多手写 bi 张。

请问小明最多能凑出多少套牌?

输入格式

输入共 3 行, 第一行为两个正整数 n,m。

第二行为 n 个正整数 a1,a2,…,an。

第三行为 n 个正整数 b1,b2,…,bn 。

输出格式

一行, 一个整数表示答案。

样例输入

4 5
1 2 3 4
5 5 5 5

样例输出

3

样例说明

这 5 张空白牌中, 拿 2 张写 1 , 拿 1 张写 2 , 这样每种牌的牌数就变为了 3,3,3,4, 可以凑出 3 套牌, 剩下 2 张空白牌不能再帮助小明凑出一套。

评测用例规模与约定
对于 30%的数据, 保证 n≤2000;

对于 100% 的数据, 保证 n≤2×105;ai,bi≤2*n;m≤n2 。

运行限制

最大运行时间:1s
最大运行内存: 512M

分析

很明显的二分题目,mid是可以凑出的套数,如果mid可以满足条件,也就是mid这个套数是可以实现的,那么比mid小的所有套数也一定是可以实现的,因此答案在mid-r中也就是l=mid。

另一个难点就是如何判断这个套数是否能实现,也即是check函数的写法,我们定义t为套数,还要定义tmp表示万能牌的数量,这里需要枚举每一种牌,如果t<=a[i]那么这种牌就可以实现,直接continue节省时间,如果t>a[i]+b[i]那么很明显,实现不了,如果t>a[i]+tmp那么也是实现不了的,那么剩下的就是a[i]配合万能牌可能实现t的情况了,t-a[i]<=tmp那么我们的万能拍就被消耗了这么多张,tmp就要减去差值,如果a[i]配合万能牌也不够t,那就实现不了。

代码实现

package com.zxy.exam;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;public class _卡牌 {static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));static PrintWriter pw = new PrintWriter(System.out);static int N = 100010;static int[] a = new int[N];static int[] b = new int[N];static int n ;static long m;public static void main(String[] args) throws IOException {String[] s = bf.readLine().split(" ");n = Integer.parseInt(s[0]);m = Integer.parseInt(s[1]);s = bf.readLine().split(" ");for (int i = 0; i < s.length; i++) {a[i]=Integer.parseInt(s[i]);}s = bf.readLine().split(" ");for (int i = 0; i < s.length; i++) {b[i]=Integer.parseInt(s[i]);}int l = 0;int r = n*2;while (l < r){int mid = l + r + 1 >> 1;if (check(mid)){l = mid;}else r = mid - 1;}pw.println(l);pw.flush();}private static boolean check(int t) {long tmp = m;for (int i = 0; i < n; i++) {if (a[i]>=t) continue;if (b[i]+a[i]<t) return false;if (tmp + a[i] < t) return false;if (t - a[i] <= tmp){tmp -= (t-a[i]);}else {return false;}}return true;}
}

染色时间

问题描述

小蓝有一个 n 行 m* 列的白色棋盘, 棋盘的每一个方格都可以被染成彩色。

每个方格有一个染色时间 tij*, 不同方格的染色时间可能不同。如果一个方 格被触发了染色, 这个方格就会在 tij 秒之后变成彩色, 然后将自己上下左右四 个方向相邻的方格触发染色。每个方格只能被触发染色一次, 第一次触发之后 的触发为无效触发。

给定每个方格的染色时间, 在时刻 0 触发第一行第一列的方格染色, 请问 多长时间后整个棋盘完成染色。

输入格式

输入的第一行包含两个整数 n,m, 分别表示棋盘的行数和列数。

接下来 n* 行, 每行 m 个正整数, 相邻的整数之间用一个空格分隔, 表示每 个方格的染色时间。该部分的第 i* 行第 j* 个整数表示 tij, 即第 i* 行第 j* 列的方 格的染色时间。

输出格式

输出一行包含一个整数, 表示整个棋盘完成染色的时间。

样例输入

2 31 2 34 5 6

样例输出

12

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

分析

这道题目很明显的dfs模板题,需要注意的是这个染色时间,他是四个方向同时进行的,因此我们要找的是最大的时间,所以count要不断进行比较,从而找到消耗时间最多的那个格子。

需要注意的是,自己手写的这个储存坐标的类,一定要重写Comparable方法,否则无法顺利存如队列中!

代码实现

package com.zxy.exam;import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class _染色时间 {static int N = 510;static int[][] a = new int[N][N];static int[] dx = {-1,0,1,0};static int[] dy = {0,1,0,-1};static int count = 0;static int n,m;public static void main(String[] args) {Scanner scan = new Scanner(System.in);n = scan.nextInt();m = scan.nextInt();for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {a[i][j]=scan.nextInt();}}dfs();}private static void dfs() {Queue<Color> q = new LinkedList<>();q.add(new Color(0,0,a[0][0]));a[0][0]=0;while (!q.isEmpty()){Color tmp = q.poll();if (tmp.getTime() > count ){count = tmp.getTime();}for (int i = 0; i < 4; i++) {int x = dx[i]+tmp.x;int y = dy[i] + tmp.y;if (x >= 0 && x < m && y >= 0 && y < m && a[x][y]>0){q.add(new Color(x,y,tmp.time+a[x][y]));a[x][y]=0;}}}System.out.println(count);}}
class Color implements Comparable<Color>{int x;int y;int time;@Overridepublic int compareTo(Color o) {return this.time - o.time;}public Color(int x, int y, int time) {this.x = x;this.y = y;this.time = time;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getTime() {return time;}public void setTime(int time) {this.time = time;}
}

相关文章:

蓝桥杯真题05

重新排序 问题描述 给定一个数组 A 和一些查询 Li,Ri 求数组中第 Li 至第 Ri个元素之和。 小蓝觉得这个问题很无聊, 于是他想重新排列一下数组, 使得最终每个查询结果的和尽可能地大。小蓝想知道相比原数组, 所有查询结果的总和最多可以增加多少? 输入格式 输入第一行包含…...

PMP那些事儿,备考小白看过来

一、PMP是什么&#xff1f; PMP指的是项目管理专业人士资格认证。它是由美国项目管理协会(Project Management Institute(PMI)发起的&#xff0c;严格评估项目管理人员知识技能是否具有高品质的资格认证考试。 其目的是为了给项目管理人员提供统一的行业标准。目前&#xff0…...

【数据分析实战】基于python对酒店预订需求进行分析

文章目录&#x1f4da;引言&#x1f4d6;数据加载以及基本观察&#x1f4d1;缺失值观察及处理&#x1f516;缺失值观察以及可视化&#x1f516;缺失值处理&#x1f4d6;用户数据探索&#x1f4d1;什么时间预定酒店将会更经济实惠&#xff1f;&#x1f4d1;哪个月份的酒店预订是…...

【新2023Q2模拟题JAVA】华为OD机试 - 数组的中心位置

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:数组的中心位置 题目 给你一…...

Vue的props组件详解

const props defineProps({name: String, }); String 是在 defineProps() 函数中用来声明 name prop 的类型&#xff0c;表示 name 必须是字符串类型。如果父组件没有传入 name 或传入的 name 不是字符串类型&#xff0c;那么就会产生类型验证错误。 defineProps() 函数支持…...

抽烟行为识别预警系统 yolov5

抽烟行为识别预警系统基于yolov5网络模型智能分析技术&#xff0c;抽烟行为识别预警算法通过监测现场人员抽烟行为自动存档进行报警提示。我们选择当下YOLO卷积神经网络YOLOv5来进行抽烟识别检测。6月9日&#xff0c;Ultralytics公司开源了YOLOv5&#xff0c;离上一次YOLOv4发布…...

【0基础学爬虫】爬虫基础之文件存储

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…...

airflow源码分析-任务调度器实现分析

Airflow源码分析-任务调度器实现分析 概述 本文介绍Airflow执行器的总体实现流程。通过函数调用的方式说明了Airflow scheduler的实现原理&#xff0c;对整个调度过程的源码进行了分析。 通过本文&#xff0c;可以基本把握住Airflow的调度器的运行原理主线。 启动调度器 可…...

一文学会数组的reduce()和reduceRight()

reduce()方法和reduceRight()方法依次处理数组的每个成员&#xff0c;最终累计为一个值。 它们的差别是&#xff0c;reduce()是从左到右处理&#xff0c;reduceRight()则是从右到左&#xff0c;其他完全一样。 [1, 2, 3, 4, 5].reduce(function (a, b) {console.log(a, b);ret…...

登录校验-Filter

上一篇介绍完了基础应用和细节&#xff0c;现在来完成登录校验功能基本流程&#xff1a; 要进入后台管理系统&#xff0c;必须完成登录操作&#xff0c;此时就需要访问登录接口Login。登录成功服务端会生成一个JWT令牌&#xff0c;并且返回给前端&#xff0c;前端会将JWT令牌存…...

C C++ Java python 分别写出不同表白girlfriend的爱心动态代码实现

C `` #include <stdio.h> #include <stdlib.h> #include <windows.h> void heart_animation() {int i, j, k; for (i = 1; i <= 6; i++) {for (j = -3; j <= 3; j++) {for (k = -4; k <= 4; k++) {if (abs(j) + abs(k) < i * 2) {printf(“I”)…...

ThreeJS-投影、投影模糊(十七)

无投影&#xff1a; 完整的代码&#xff1a; <template> <div id"three_div"></div> </template> <script> import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/Or…...

蓝桥杯赛前冲刺-枚举暴力和排序专题1(包含历年蓝桥杯真题和AC代码)

目录 连号区间数&#xff08;第四届蓝桥杯省赛CB组,第四届蓝桥杯省赛JAVAB组&#xff09; 递增三元组&#xff08;第九届蓝桥杯省赛CB组,第九届蓝桥杯省赛JAVAB组&#xff09; 特别数的和&#xff08;第十届蓝桥杯省赛CB组,第十届蓝桥杯省赛JAVAB组&#xff09; 错误票据&a…...

Github库中的Languages显示与修改

目录 前言 【.gitattributes】文件 修改GitHub语言 前言 上传一个项目到GitHub时&#xff0c;发现显示的语言并非是自己项目所示的语言&#xff0c;这样的情况是经常发生的&#xff0c;为了能到达自己所需快速检索&#xff0c;或者是外部访问者能很好的搜索我们的项目&#…...

RocketMQ消息高可靠详解

文章目录 消息同步策略殊途同归同步基于offset而不是消息本身刷盘策略RocketMQ broker服务端以组为单位提供服务的,拥有着一样的brokerName则认为是一个组。其中brokerId=0的就是master,大于0的则为slave。 消息同步策略 master和slave都可以提供读服务,但是只有master允许…...

【python设计模式】4、建造者模式

哲学思想&#xff1a; 建造者模式的哲学思想是将复杂对象的创建过程分解成多个简单的步骤&#xff0c;并将这些步骤分别封装在一个独立的建造者类中。然后&#xff0c;我们可以使用一个指挥者类来控制建造者的调用顺序&#xff0c;以便在每个步骤完成后正确地构建复杂对象。 …...

【全网独家】华为OD机试Golang解题 - 机智的外卖员

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 如果想要在华为od机试中获取高分…...

Sentinel滑动时间窗限流算法原理及源码解析(中)

文章目录 MetricBucketMetricEvent数据统计的维度WindowWrap样本窗口实例 范型T为MetricBucket windowLengthInMs 样本窗口长度 windowStart 样本窗口的起始时间戳 value 当前样本窗口的统计数据 其类型为MetricBucket MetricBucket MetricEvent数据统计的维度 1、首先计算27t位…...

【OpenLayers】VUE+OpenLayers+ElementUI加载WMS地图服务

【OpenLayers】VUEOpenLayersElementUI加载WMS地图服务准备工作安装vue创建vue项目安装OpenLayers安装ElementUI加载wms地图服务准备工作 需要安装好nodejs&#xff0c;nodejs下载地址&#xff0c;下载对应的版本向导式安装即可。 安装完成后&#xff0c;控制台输入node -v&a…...

linux 命名管道 mkfifo

专栏内容&#xff1a;linux下并发编程个人主页&#xff1a;我的主页座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物&#xff0e;目录 前言 概述 原理介绍 接口说明 代码演示 结尾 前言 本专栏主要分享linux下并发编程…...

Redis(主从复制、哨兵模式、集群)概述及部署

目录 1.redis高可用 2.redis持久化 1.Redis 提供两种方式进行持久化&#xff1a; 2.RDB 持久化 3.AOF持久化 4.RDB和AOF的优缺点 5.Redis 性能管理 3.redis主从复制 1.Redis主从复制的概念 2.Redis主从复制的作用 3.Redis主从复制的搭建 4.redis哨兵模式 1.哨兵模式…...

windows下软件包安装工具之Scoop安装与使用

Scoop介绍 Scoop是Windows的命令行程序安装器。 Scoop从命令行安装程序&#xff0c;及其容易。它有如下特点&#xff1a; 消除权限弹出窗口隐藏 GUI 向导样式的安装程序防止安装大量程序的 PATH 污染避免安装和卸载程序的意外副作用自动查找并安装依赖项自行执行所有额外的设…...

九龙证券|人工智能+国产软件+智慧城市概念股火了,欧洲资管巨头大举抄底

近一周组织调研个股数量有130多只&#xff0c;迈瑞医疗成为调研组织数量最多的股票。 证券时报数据宝统计&#xff0c;近一周组织调研公司数量有130多家。从调研组织类型来看&#xff0c;证券公司调研相对最广泛&#xff0c;调研80多家公司。 迈瑞医疗获超500家组织调研 迈瑞…...

Nacos下载安装与配置(windows)

一、Nacos下载 官网地址&#xff1a;home (nacos.io) 点击前往Github&#xff0c;跳转至Github下载页面。 点击Tags&#xff0c;跳转至版本选择页面&#xff0c;此处选择2.2.0版本。 点击nacos-server-2.2.0.zip&#xff0c;进行下载。 二、Nacos安装 将下载的压缩包解压至需…...

QT学习笔记(语音识别项目 )

语音识别项目 我们知道 AI 智能音箱已经在我们生活中不少见&#xff0c;也许我们都玩过&#xff0c;智能化非常高&#xff0c;功能 强大&#xff0c;与我们平常玩的那种蓝牙音箱&#xff0c;Wifi 音箱有很大的区别&#xff0c;AI 智能在哪里呢&#xff1f;语音识别技 术和云端…...

Vulnhub:DC-4靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.251 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --scripthttp-enum 192.168.111.251 访问目标网站发现需要登录 使用账号admin爆破出密码&#xff1a;happy 登陆后抓包执行反弹shell 提权 在/home/jim/backu…...

序列差分练习题--从模板到灵活运用

本篇包含6道序列差分练习题及题解&#xff0c;难度由模板到提高 语文成绩 题目背景 语文考试结束了&#xff0c;成绩还是一如既往地有问题。 题目描述 语文老师总是写错成绩&#xff0c;所以当她修改成绩的时候&#xff0c;总是累得不行。她总是要一遍遍地给某些同学增加分…...

Xshell 连接 Ubuntu 20.04

1 更改网络配置信息 修改/etc/netplan/01-network-manager-all.yaml文件信息 sudo gedit /etc/netplan/01-network-manager-all.yaml删除原有内容&#xff0c;替换为以下信息&#xff1a; 注意&#xff1a;addresses、gateway4 要根据个人虚拟机的实际情况修改 # Let Networ…...

【网口交换机:交换机KSZ9897学习-笔记-资料汇总-记录】

【网口交换机&#xff1a;交换机KSZ9897学习-笔记-资料汇总-记录】1、概述2、 自己的学习与摸索之路第一阶段&#xff1a;随意在网上查找相关资料第二阶段&#xff1a;针对性在网上资料第三阶段&#xff1a;测试并且使用开发板第四阶段&#xff1a;针对性使用工具进行测试。2、…...

linux信号量及其实例

概述 Linux信号量是用于进程间同步和互斥的一种通信机制。本质是计数器 它们通常用于控制对共享资源的访问&#xff0c;以确保只有一个进程可以同时访问该资源。以下是一个详细的教程和C语言代码示例&#xff0c;展示如何使用信号量进行进程间通信。 创建信号量 要使用信号量…...