【蓝桥杯】每日四道编程题(两道真题+两道模拟)| 第四天
专栏: 蓝桥杯——每日四道编程题(两道真题+两道模拟)
“蓝桥杯就要开始了,这些题刷到就是赚到”
₍ᐢ..ᐢ₎♡
另一个专栏: 蓝桥杯——每日四道填空题(两道真题+两道模拟题)
目录
专栏: 蓝桥杯——每日四道编程题(两道真题+两道模拟)
另一个专栏: 蓝桥杯——每日四道填空题(两道真题+两道模拟题)
第一道真题(2022年省赛):数位排序
第二道真题(2018年省赛):全球变暖
第三道模拟题(acwing): 不同路径数
第四道模拟题(2022年第三次模拟赛):清理水草
第一道真题(2022年省赛):数位排序
问题描述
小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位 之和 13 。
又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。
给定正整数 n, m 请问对 1 到 n 采用这种方法排序时, 排在第 m 个的元 素是多少?
输入格式
输入第一行包含一个正整数 n 。第二行包含一个正整数 m 。
输出格式
输出一行包含一个整数, 表示答案。样例输入
13 5
样例输出
3
样例说明
1 到 13 的排序为: 1,10,2,11,3,12,4,13,5,6,7,8,91,10,2,11,3,12,4,13,5,6,7,8,9 。第 5 个数为 3 。
这题首先要建立其原数和其数位和的联系 ,并要根据数位和排序。
这题重点是sort函数的使用。
Sort(start,end,排序方法):
第三个参数是排序的方法,可以是从小到大【less<数据类型>( )】也可是从大到小【greater<数据类型>()】,还可以不写第三个参数,此时默认的排序方法是从小到大排序,而且这个排序方法可以自己找参照物写 。这里就可以选择数位和为参照物进行排序,具体操作看代码!
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6 + 10;
int a[N] , b[N] , n , m ; //a[]储存原数 , b[]存储数位和
int sum(int num) //求数位和
{int h = 0;while(num){h += num % 10;num /= 10;}return h;
}
bool cmp(int x , int y) //x 和 y是比较的值。
{if(b[x] != b[y]) return b[x] < b[y]; //按数位小的排在前面return x < y; //按原数小的排在前面
}
int main()
{scanf("%d%d", &n , &m);for (int i = 1 ; i <= n ; ++i ){a[i] = i;b[i] = sum(i);}sort(a + 1 , a + n + 1 , cmp);printf("%d", a[m]);return 0;
}
这题也可以用结构体写,复习一下结构体吧:
#include <iostream>
#include <algorithm>
using namespace std;
struct sw
{int a; //原数int b; //数位和
}a[1000100];
bool cmp(sw x, sw y)
{if(x.b != y.b) return x.b < y.b;return x.a < y.a;
}
int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= n; i ++){a[i].a = i;int t = a[i].a;a[i].b = 0;while (t){a[i].b += t % 10;t /= 10;}}sort(a + 1 , a + n + 1 , cmp);cout << a[m].a;return 0;
}
第二道真题(2018年省赛):全球变暖
题目描述
你有一张某海域 NxNNxN 像素的照片,"."表示海洋、"#"表示陆地,如下所示:.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
输入描述
第一行包含一个整数 N (1≤N≤1000)。以下 N 行 N 列代表一张海域照片。
照片保证第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。、
输出一个整数表示答案。
输入样例
7 ....... .##.... .##.... ....##. ..####. ...###. .......
输出样例
1
运行限制
最大运行时间:1s
最大运行内存: 256M
算法:DFS
这题和之前我们刷的【蓝桥杯】每日四道填空题(两道真题+两道模拟题|第二天 中2022年第三次模拟赛的最大连通块这题简直不要太像,这些一个个的岛屿可以看出一个个不同的连通块,把题目的意思还原出来就是找岛屿中是否存在一个上下左右全是的陆地(关键岛)。存在则不会完全淹没,不存在则会被完全淹没。
#include <bits/stdc++.h>using namespace std;const int N=1010;int n,ans=0;
char g[N][N];
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
bool FLAG;//表示这座岛屿有没有被完全淹没,true表示被完全淹没,false表示没有被完全淹没void dfs(int x,int y)
{if(x<0||x>=n||y<0||y>=n||g[x][y]!='#')return ;g[x][y]='X'; //把找了的陆地,排除掉,千万别用'.'啊,不然会影响下面的判断的。bool flag=true;for(int i=0;i<4;i++){int nx=x+dx[i];int ny=y+dy[i];if(g[nx][ny]=='.')flag=false; dfs(nx,ny);}//只要出现一个上下左右全是‘#’的陆地(关键岛),就将FLAG=false;就可以判断这个岛屿是不会被完全淹没了。//但这里还不能退出递归,需要把这个连通的岛屿搜索完,即全变成’X‘。if(flag) FLAG=false;//FLAG=false,这座岛屿不会被完全淹没,如果最后递归完此岛屿,没有出现关键岛,那他一定会被淹没的。
}int main()
{cin>>n;for(int i=0;i<n;i++)cin>>g[i];for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(g[i][j]=='#') {FLAG=true;//默认这座岛屿被完全淹没dfs(i,j);if(FLAG) ans++;} cout<<ans<<endl;return 0;
}
第三道模拟题(acwing): 不同路径数
我们好像做DFS的题,一般查找了的点不需要再查找了,因此我就去找了一道需要重复查找的题~
这题要对查找的(k+1)位的数去重,首先想到的就是哈希表实现的unordered_map。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
using namespace std;const int N = 10;int n , m , k;
char g[N][N];
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
unordered_map<string, int> h;void dfs(int a, int b, int u,string path)
{if(u == k){h[path] = 1;return;}for(int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i];if(x >= 0 && x < n && y >= 0 && y < m){dfs(x, y, u + 1, path + g[x][y]);}}
}int main()
{cin >> n >> m >> k;k++;string path;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++)cin >> g[i][j];}for(int i = 0; i < n; i++){for(int j = 0; j < m; j++)dfs(i, j, 0, path);}cout << h.size(); //直接统计有多少个不同的键值对就行了return 0;
}
第四道模拟题(2022年第三次模拟赛):清理水草
问题描述
小蓝有一个 n * m 大小的矩形水域,小蓝将这个水域划分为 n 行 m 列,行数从 1 到 n 标号,列数从 1 到 m 标号。每行和每列的宽度都是单位 1 。
现在,这个水域长满了水草,小蓝要清理水草。
每次,小蓝可以清理一块矩形的区域,从第 r1 行(含)到第 r2 行(含)的第 c1 列(含)到 c2 列(含)。
经过一段时间清理后,请问还有多少地方没有被清理过。输入格式
输入第一行包含两个整数 n, m,用一个空格分隔。
第二行包含一个整数 t ,表示清理的次数。
接下来 t 行,每行四个整数 r1, c1, r2, c2,相邻整数之间用一个空格分隔,表示一次清理。请注意输入的顺序。输出格式
输出一行包含一个整数,表示没有被清理过的面积。
样例输入1
2 3
2
1 1 1 3
1 2 2 2样例输出1
2
样例输入2
30 20
2
5 5 10 15
6 7 15 9样例输出2
519
评测用例规模与约定
对于所有评测用例,1 <= r1 <= r2 <= n <= 100, 1 <= c1 <= c2 <= m <= 100, 0 <= t <= 100。
这题看着其实很简单,但关键是如何优化算法,减少时耗。
这题看到子矩阵 ,我们应该马上想到二维前缀和二维差分来优化。
不熟悉一、二维前缀和一二维差分的友友,看我总结的这篇文章(点这),非常详细哦!
#include <iostream>
using namespace std;
int n, m;
int g[105][105]; //没被清理的地方都设成 0 。
void insert(int x1, int y1, int x2, int y2) { g[x1][y1] += 1;g[x2 + 1][y1] -= 1;g[x1][y2 + 1] -= 1;g[x2 + 1][y2 + 1] += 1;
}
int main() {int t;cin >> n >> m >> t;int x1, x2, y1, y2;for(int i = 0; i < t; i ++) {scanf("%d%d%d%d", &x1, &y1, &x2, &y2);insert(x1, y1, x2, y2); //全是0的二维数组,它本身也是自己的二维差分数组。 }for(int i = 1; i <= n; i ++)for(int j = 1; j <= m; j ++)g[i][j] += g[i - 1][j] + g[i][j - 1] - g[i - 1][j - 1]; //清理掉的地方前缀和是1,没有清理的地方,前缀和是0 int res = 0;for(int i = 1; i <= n; i ++)for(int j = 1; j <= m; j ++)if(!g[i][j]) res ++;cout << res << endl;return 0;
}
相关文章:

【蓝桥杯】每日四道编程题(两道真题+两道模拟)| 第四天
专栏: 蓝桥杯——每日四道编程题(两道真题两道模拟) “蓝桥杯就要开始了,这些题刷到就是赚到” ₍ᐢ..ᐢ₎♡ 另一个专栏: 蓝桥杯——每日四道填空题(两道真题两道模拟题) 目录 专栏࿱…...

大家有没有时候觉得,递归,分治,回溯,傻傻分不清楚?
递归,分治,回溯的定义 递归(Recursion) 递归是一种解决问题的方法,它将一个问题分解成一个或多个较小的相同类型的子问题,然后通过递归调用自身来解决这些子问题。递归通常包括一个基本情况(b…...

Java 8 - Lambda 表达式
1. 函数式接口 当一个接口中只有一个非 default 修饰的方法,这个接口就是一个函数式接口用 FunctionalInterface 标注 1)只有一个抽象方法 FunctionalInterface public interface MyInterface {void print(int x); } 2)只有一个抽象方法和…...

【Ruby学习笔记】4.Ruby 类和对象及类案例
前言 本章介绍Ruby的类和对象及类案例。 Ruby 类和对象 Ruby 是一种完美的面向对象编程语言。面向对象编程语言的特性包括: 数据封装数据抽象多态性继承 这些特性将在 面向对象的 Ruby 中进行讨论。 一个面向对象的程序,涉及到的类和对象。类是个别…...

分享一个计算表格内单元格合并的工具,支持行合并、列合并等常见场景
分享一个计算表格内单元格合并的工具,支持行合并、列合并等常见场景 效果图 安装 cj-toolkit-x/table-cell-merger 插件 npm i cj-toolkit-x/table-cell-merger使用方法 import {TableCellMerger} from "cj-toolkit-x/table-cell-merger" // 创建一个单…...

CUDA编程(三):Hello world
CUDA编程(三):Hello worldCUDA编程Hello worldCUDA编程 CUDA是Compute Unified Device Architecture的缩写,由英伟达公司2007年开始推出,初衷是为GPU增加一个易用的编程接口,让开发者无需学习复杂的着色语…...

二十九、String的不可变性
一、String的基本特性 1.String:字符串,使用一对“”引起来表示 1)String s1 “hallo”; //字面量的定义方式 2)String 说 new String(“hello”)’ 2.String声明为final的,不可被继承。 3.String实现了Serialzable接口:表示字符串是支持序列化的。实…...

TCP服务器如何使用select处理多客户连接
TCP是一种面向连接的通信方式,一个TCP服务器难免会遇到同时处理多个用户的连接请求的问题,本文用一个简化的实例说明如何在一个TCP服务器程序中,使用select处理同时出现的多个客户连接,文章给出了程序源代码,本文假定读者已经具备了基本的socket编程知识,熟悉基本的服务器…...

python字符编码
目录 ❤ 前言 文本编辑器存取文件的原理(nodepad,pycharm,word) python解释器执行py文件的原理 ,例如python test.py 总结 ❤ 什么是字符编码? ASCII MBCS Unicode ❤ 字符编码的发展史 阶段一: 现代计算…...

面向对象练习题(8)
目录 第一题 第二题 第三题 第一题 思路分析: 1.Person p new Student();这就是一个向上转型,让父类的引用指向子类的对象,但是向上转型不能访问子类的属性和方法 我们在写代码时看的是编译类型 在运行是看的是运行类型 p.run(); p.eat(); …...

重构类关系-Extract Interface提炼接口八
重构类关系-Extract Interface提炼接口八 1.提炼接口 1.1.使用场景 若干客户使用类接口中的同一子集,或者两个类的接口有部分相同。将相同的子集提炼到一个独立接口中。 类之间彼此互用的方式有若干种。“使用一个类”通常意味用到该类的所有责任区。另一种情况…...

vivo手机各系列简介和拆解
Vivo是中国智能手机制造商,其产品线较多,主要包括以下系列: X系列:X系列是Vivo的高端智能手机系列,注重出色的拍照性能、高质量的音效和高端的设计。该系列主要面向追求高质量拍照和高端体验的用户。 V系列࿱…...

Redis:redis通用命令;redis常见数据结构;redis客户端;redis的序列化
一、redis命令 1.redis通用命令 Redis 通用命令是一些 Redis 下可以作用在常用数据结构上的常用命令和一些基础的命令 常见的命令有: keys 查看符合模板的所有key,不建议在生产环境设备上使用,因为keys会模式匹配所有符合条件的key&#…...

Java新特性
switch Java中switch的三种用法方式 JAVA中的switch Java switch 中如何使用枚举? 注解 天天用注解你真的知道怎么用吗?Java中的注解及其实现原理。 JAVA注解 JAVA注解 基础 集合判空 求和 Java8之List求和 JAVA中对list使用stream对某个字段求和…...

Java_Spring:8. Spring 中 AOP 的细节
目录 1 说明 2 AOP 相关术语 3 学习 spring 中的 AOP 要明确的事 4 关于代理的选择 1 说明 spring 的 aop通过配置的方式,实现上一章节的功能。 2 AOP 相关术语 Joinpoint(连接点): 所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring …...

uni-app--》uni-app的生命周期讲解
🏍️作者简介:大家好,我是亦世凡华、渴望知识储备自己的一名在校大学生 🛵个人主页:亦世凡华、 🛺系列专栏:uni-app 🚲座右铭:人生亦可燃烧,亦可腐败…...

fastp软件介绍
fastp软件介绍1、软件介绍2、重要参数解析2.1 全部参数2.2 使用示例2.3 重要参数详解(1)UMI去除(2)质量过滤(3)长度过滤(4)低复杂度过滤(5)adapter过滤&#…...

C++继承相关总结
文章目录前言1.继承的相关概念1.继承概念2.继承的相关语法3.基类和派生类对象赋值转换(赋值兼容规则)2.继承中的注意事项1.继承中的作用域2.派生类的默认成员函数1.构造函数与拷贝构造2.赋值重载与析构3.友元关系与静态成员变量3.多继承(菱形继承)1.虚拟继承2.虚拟继…...

【从零开始学习 UVM】8.2、Reporting Infrastructure —— uvm_printer 详解
文章目录 老派风格在UVM中如何完成uvm 风格Table printerTree printerLine printerprint使用print使用条件使用konb更改print配置示例在一个随机验证环境中,数据对象不断地由不同的组件生成和操作,如果能够显示对象的内容,则调试会变得更加容易。 老派风格 传统上,这是通…...

Mybatis、TKMybatis对比
文章目录1.Mybatis(1)配置文件(2)实体类(3)Mapper(4)mybatis-config.xml2.TKMybatis(1)配置文件(2)实体类(3)M…...

37了解高可用技术方案,如冗余、容灾
高可用性技术方案是指在系统设计和架构中采用一系列措施来确保系统在遇到各种故障和问题时仍能保持持续的可用性,避免因单点故障而导致系统宕机、数据丢失等问题。其中包括冗余和容灾技术。 冗余技术: 冗余技术是指通过增加系统组件的冗余来提高系统可靠…...

jdb调试问题集锦
https://bbs.kanxue.com/thread-210049.htm蓝铁 1 2017-8-25 19:40 4 楼 0 根据提示,可知,出错的地方是,android.app.ActivityThread.handleBindApplication(), 行4,400 查看源码可以发现,代码中指向的是app.onCreate() …...

要和文心一言来一把你画我猜吗?
想和文心一言来一把你画我猜吗? ChatGPT的爆火,让AI对话模型再次走入大众视野。大家在感叹ChatGPT的智能程度时,总会忍不住想:如果我们也有自己的AI对话模型就好了。在社会的压力下,国内的厂商和研究机构也纷纷做出尝试…...

delete[] p->elems和free(p->elems)有什么区别?
delete[]和free()都是释放内存的函数,但它们具有不同的使用方法和适用情况。 delete[] 通常用于释放C中动态分配的数组空间。在使用new[]运算符分配内存时,应使用delete[]运算符来释放分配的内存。delete[] 运算符会调用每个数组元素的析构函数…...

CAS问题
CAS🔎什么是CAS🔎伪代码解析🔎CAS是如何实现原子性的🔎CAS的应用🌻实现原子类🌻实现自旋锁🔎ABA问题🌻ABA问题可能引起的BUG🌻ABA问题的解决方案🔎结尾&#…...

网络编程socket(下)
目录 一、TCP网络程序 1.1 服务端初始化 1.1.1 创建套接字 1.1.2 服务端绑定 1.1.3 服务端监听 1.2 服务端启动 1.2.1 服务端获取连接 1.2.2 服务端处理请求 1.3 客户端初始化 1.4 客户端启动 1.4.1 发起连接 1.4.2 发起请求 1.5 网络测试 1.6 单执行流服务端的…...

华为OD机试题【打折买水果】用 C++ 编码,速通
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:打折买水果 题目 有 m m m…...

JSON 数据类型
JSON 数据类型 JSON 格式支持以下数据类型: 类型描述数字型(Number)JavaScript 中的双精度浮点型格式字符串型(String)双引号包裹的 Unicode 字符和反斜杠转义字符布尔型(Boolean)true 或 fal…...

Python函数简介
Python是一种高级编程语言,它的函数是其中一个非常重要的特性。在程序中,函数是一段被命名的代码块,它可以接受输入并且返回输出。本篇文章将介绍Python函数的基本概念、定义、调用和参数。 基本概念 在Python中,函数是由def关键…...

一文读懂 mysql 为什么要两阶段提交以及两阶段提交原理
文章目录 为什么要两阶段提交redo log与binlog两份日志之间的逻辑不一致,会出现什么问题?两阶段提交是怎么保证逻辑一致的呢?当 binlog 写完,redo log 还没 commit 前发生 crash,那崩溃恢复后 MySQL 如何处理?redo 与 binlog 的刷盘时机MySQL 的双 1 配置能否只用 redo l…...