笔试练习day5

目录

  • 游游的you
    • 题目解析
      • 解法
        • 方法一贪心
        • 方法二
  • 腐烂的苹果
    • 题目解析
      • 例子1
      • 例子2
        • 解法
          • 多源BFS+最短路径
          • 代码
          • 代码解析
  • JZ62 孩子们的游戏(圆圈中最后剩下的数)
    • 题目解析
      • 解法
        • 方法一模拟
          • 环形链表模拟
          • 数组模拟
        • 方法二递推/递归/动态规划
          • 状态表示
          • 状态转移方程
          • 代码

感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐣🐣 python
🐓🐓🐓 数据结构C语言
🐔🐔🐔 C++
🐿️🐿️🐿️ 文章链接目录
🏀🏀🏀 笔试练习题

游游的you

链接游游的you
在这里插入图片描述

题目解析

这道题就是凑字符,从题目可以看到凑出you的时候得分为2,凑出oo的时候得分为1,注意oooo的得分为3,不是2

you的得分是oo的两倍,且you中各字符都只需要凑出1个就可以了,所以我们应该优先凑出you

oo这个字符串需要两个o,应该是最后剩下多余的o进行凑

解法

方法一贪心
int main() {int q,a,b,c,sum=0;cin>>q;while(q--){cin>>a>>b>>c;int x=min(a,min(b,c));cout<<x*2+max(b-x-1,0)<<endl;}return 0;
}

这里用了两个函数min和max,min(a,min(b,c))最外面的min表示找出a和min(b,c)中最小的一个数,min(b,c)表示找出b和c中最小的一个数

最后打印是根据数学推导出来的,x*2表示的是凑出you的得分(x表示的是凑出you的个数)

max(b-x-1,0)是找出b-x-1和0中谁最大,如果b-x-1大于0那么就说明o还有多余的,剩余的o为b-x

当b-x=1的时候表示剩余的o为1,但是1-1=0,所以max最后为0

而当b-x>1的时候,我们以2为例,b-x-1=2-1=1,max(1,0)=1

方法二
#include <iostream>
using namespace std;int main() {int q,a,b,c,sum=0;cin>>q;for(int i=0;i<q;i++){cin>>a>>b>>c;while(a&&b&&c){sum=sum+2;a--;b--;c--;}if(b>1){sum=sum+b-1;}cout<<sum<<endl;sum=0;}return 0;
}

腐烂的苹果

链接腐烂的苹果
在这里插入图片描述

题目解析

例子1

我们以这个图为例子

在这里插入图片描述
我们需要先找到一个腐烂的苹果,也就是2
在这里插入图片描述
经过一分钟后苹果向他的上下左右开始传播,被传播的苹果用绿色圆圈表示
在这里插入图片描述
之后被传播的苹果腐烂
在这里插入图片描述

第二分钟这些苹果又开始传播,由于中间没有苹果,所以中间不会被传播
在这里插入图片描述
之后的过程如下图所示
在这里插入图片描述
第三分钟
在这里插入图片描述
第四分钟
在这里插入图片描述
最后经过四分钟所以苹果都腐烂了,所以返回4

例子2

这个例子是永远有一个苹果不会被腐烂
在这里插入图片描述
先找出腐烂的苹果
在这里插入图片描述
第一分钟开始传播
在这里插入图片描述
传播后由于被传播的苹果附近没有苹果,导致无法继续传播,且这些格子内存在一个没有腐烂的苹果,所以最后返回-1
在这里插入图片描述

解法
多源BFS+最短路径

在这里插入图片描述
因为一开始可能不只有一个苹果是坏的,所以当不只有一个苹果的时候要让他们同一时刻都向他的上下左右扩散

所以需要将这三个苹果统一加到一个队列里,每次传播的时候都将队列里的所以元素都push出去,然后统一向外扩散

当扩散到最后一个苹果的时候,扩散的层数就是分钟数

因此我们需要用sz标记当前队列的元素,每次出堆的时候出sz个,然后用ret表示扩展了多少层,最后扩展完后遍历一遍数组,如果还有一个没有腐烂的苹果那么就返回-1

代码
class Solution {
int m,n;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
bool vis[1010][1010]={0};
public:int rotApple(vector<vector<int> >& grid) {n=grid.size(),m=grid[0].size();queue<pair<int,int>> q;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(grid[i][j]==2){q.push({i,j});}}}int ret=0;while(q.size()){int sz=q.size();ret++;while(sz--){auto[a,b]=q.front();q.pop();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&&grid[x][y]==1&&!vis[x][y]){vis[x][y]=true;q.push({x,y});}}} }for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(grid[i][j]==1&&!vis[i][j])return -1;}}return ret-1;}
};
代码解析

因为要上下左右四个方向遍历搜索,和笔试练习day4的NC242 单词搜索一样,需要创建一个方向数组dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}(这里我们可以总结出只要需要在上下左右四个方向搜索的题,我们都可以创建方向数组)

然后bool类型的数组vis记录该位置的是否已经遍历,当然我们也可以不用vis数组去标记,而是直接在原数组中将1改为2

m和n是表示二维数组grid有多少行和一行有多少个元素,q是一个队列,因为是记录的下标,所以是queue<pair<int,int>> q

因为是二维数组,所以要用两层循环去遍历去找grid[i][j]==2,如果找到了就push进q里

之后用ret去记录扩展了多少层,当队列不为空的时候就扩展一次,扩展的时候用sz去表示队列中有多少个元素

用 auto[a,b]=q.front()去得出队头元素的坐标(a,b),得到后pop

有了横纵坐标后就开始用方向数组去寻找他的上下左右是否有苹果,有苹果就让他变腐烂,并让腐烂的苹果push进队列,并修改vis[x][y]的bool值

当完全遍历完后我们需要用两层循环去查找是否还有没有腐烂的苹果,如果有就返回-1,没有就返回ret-1(因为扩展到最后一个苹果会将这个苹果坐标push进队列,然后再循环一次,但是这个苹果是最后一个,也就是ret++多了一次,所以最后要返回ret-1)

JZ62 孩子们的游戏(圆圈中最后剩下的数)

链接JZ62 孩子们的游戏(圆圈中最后剩下的数)

在这里插入图片描述

这个有点类似于约瑟夫问题
在这里插入图片描述

题目解析

我们以n=5 m=3为例子
在这里插入图片描述

刚开始从0报数
在这里插入图片描述
当报数为m-1也就是2的时候,2就要删除,并在2的下一个位置开始重新报数
在这里插入图片描述
在这里插入图片描述
这时3就应该报数0,4则报1,而0则报2,所以0要被删除
在这里插入图片描述
0的下一个位置是1,所以从1开始报数
在这里插入图片描述
这次4报的数为2,所以删除4
在这里插入图片描述
在这里插入图片描述
注意这时候虽然没有3个人了,但是因为是循环的,所以1报0后,3报1,最后1报2,所以最后应该删除1,留下3,因此返回3
在这里插入图片描述

解法

方法一模拟

这里我们只讲方法

环形链表模拟

这里的模拟是用环形链表去模拟实现的
在这里插入图片描述
每遍历到m-1个节点就删除那个节点,并让节点的前一个指向他的后一个
在这里插入图片描述
当删除到只有一个节点的时候,此时这个节点的下一个节点也是他自己,这时就直接返回节点的值
在这里插入图片描述

数组模拟

数组模拟就是创建一个长度为n的数组
在这里插入图片描述
这里需要注意一个问题就是当指针指向数组的最后一个元素的时候应该怎么回到起始位置
在这里插入图片描述
这里用的方法是当指针ptr已经指向超出数组范围的时候就让ptr的值模上5(我感觉有点怪,就是因为数组只有5个元素,既然ptr已经指向数组外了,那么就没有值,怎么就可以模n就可以回到原位置)

因为数组是不可以中间删除的,所以我们还需要创建一个bool类型的数组去用0和1表示是否删除元素

方法二递推/递归/动态规划

方法二选择用动态规划去做

状态表示

用dp[i]表示当有i个孩子围成一圈时最终获胜孩子的编号是多少
此时需要初始化dp[1]=0

状态转移方程

状态转移方程就是找出一个公式满足所有的dp[i]情况
比如状态转移方程可能是dp[i]=dp[i-1]+dp[i-2],当然也有可能是dp[i]=dp[i-1]+dp[i-2]+dp[i-3]…

下面是推导过程
假设有i个孩子,最后的孩子编号应该是i-1
在这里插入图片描述

我们需要删除第m个孩子,也就是编号为m-1,删除后从m开始
在这里插入图片描述

此时所以的编号都要更新,需要减m
在这里插入图片描述

但是因为编号不可能为负数,所以要在编号为负的所有孩子都加上i
在这里插入图片描述
这里的0更新后的编号应该是要比之前i-1大1的,所以i-1-m+1=i-m,所以-m要加上i才可以满足条件,因此要将所以负数都加上i才行

在这里插入图片描述

之前的m-1则是dp[i]
在这里插入图片描述

而现在里面的红色圆圈围成的圈表示有i-1个孩子参加游戏,最终获胜的孩子编号为dp[i-1]

注意下面这里有点绕
dp[i]和dp[i-1]存在这样的一个关系dp[i]=(dp[i-1]+m)%i

我来具体讲解一下为什么会有这个关系

在这里插入图片描述
左边我们可以看到内圈的编号都是比外圈的编号少一个m的,当dp[i-1]在左边的时候,我们是可以通过映射的方式去推导出dp[i]的,只需要让他加上m就可以得到编号了
在这里插入图片描述
当dp[i-1]在右边的时候,因为最后是要比左边多加一个i的,所以我们在dp[i-1]+m后还需要模一个i,
我们就那更新后编码为-2+i为例
先加上m就变成-2+i+m,之后(-2+i+m)%i=m-2,因为m-2小于i,所以余数就是m-2

所以dp[i]=(dp[i-1]+m)%i

有了这个式子我们就可以从dp[2]=(dp[1]+m)%2…这样一直往后推,直到推到dp[i]为止,虽然这样很绕,但是这个规律是存在的

代码

最后的代码非常简洁,但是那个公式是非常难推的

class Solution {
public:int LastRemaining_Solution(int n, int m) {int f=0;for(int i=2;i<=n;i++){f=(f+m)%i;}return f;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql原理与调优-Mysql的内存结构

1.绪论 前面说过InnoDB每次查询数据或者更新数据&#xff0c;都是先以16kb的大小将数据读取到内存中&#xff0c;然后对内存中的数据页进行操作。为了减少磁盘IO&#xff0c;Innodb的会先单独的申请一块连续的空间&#xff0c;将从磁盘中的数据页缓存到这片内存中。这片内存就…

2D Inpainting 与NeRF 3D重建的多视角一致性问题

一 问题&#xff1a; NeRF依赖于输入图像的一致性。NeRF&#xff08;Neural Radiance Fields&#xff09;在生成三维场景时&#xff0c;依赖于从多个视角拍摄的输入图像之间的一致性来准确地推断场景的三维结构和颜色信息。 具体来说&#xff1a; 多视角一致性&#xff1a; Ne…

Hive3:三种常用的复杂数据类型

一、Array类型 1、数据示例 2、实操 元数据 zhangsan beijing,shanghai,tianjin,hangzhou wangwu changchun,chengdu,wuhan,beijin创建表 CREATE TABLE myhive.test_array(name string, work_locations array<string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY \t…

LVM 使用以及配置

逻辑卷管理 (LVM) 是一种用于 Linux 系统的存储管理工具&#xff0c;比传统的磁盘分区方法更灵活。LVM 通过将物理存储设备组合成逻辑卷&#xff0c;使得磁盘空间的管理更加动态和便捷。它提供了物理层的抽象&#xff0c;让用户可以创建跨越多个物理磁盘或分区的逻辑卷。 LVM …

2024年软件测试经典面试题(全三篇)【包含答案】做完面试进入大厂不是梦

前言 迎来的便是金九银十&#xff0c;一直想着说分享一些软件测试的面试题&#xff0c;这段时间做了一些收集和整理&#xff0c;下面共有三篇经典面试题&#xff0c;大家可以试着做一下&#xff0c;答案附在后面&#xff0c;希望能帮助到大家。 软件测试经典面试题&#xff0…

【vue讲解:es6导入导出语法、 vue-router简单使用、登录跳转案例、scoped的使用、elementui使用】

1 es6导入导出语法 # 做项目&#xff1a;肯定要写模块--》导入使用# 默认导出和导入 在某个js中 # 命名导出和导入1.1 默认导出和导入 // #########导出语法########### // export default name // 只导出变量 // export default add // 只导出函数// export default {nam…

android13顶部状态栏里面调节背光 背景闪烁问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码分析 4.代码修改 5.彩蛋 1.前言 android13顶部状态栏里面调节背光, 背景闪烁问题,会出现画面不全问题,如下图 2.问题分析 这里看起来是由于隐藏的时候,界面显示是一个渐变的隐藏,但是后面的背景又是…

Vue3列表(List)

效果如下图&#xff1a;在线预览 APIs List 参数说明类型默认值bordered是否展示边框booleanfalsevertical是否使用竖直样式booleanfalsesplit是否展示分割线booleantruesize列表尺寸‘small’ | ‘middle’ | ‘large’‘middle’loading是否加载中booleanfalsehoverable是否…

stripe Element 如何使用

这里要准备好几个东西&#xff1a; 一个支付成功过后的回调 还有一个下单的接口 一旦进入这个下单界面&#xff0c;就要去调下单的接口的&#xff0c;用 post, 这个 接口你自己写&#xff0c;可以写在后端中&#xff0c;也可以放到 nextjs 的 api 中。 首先说的是这个下单…

Linux ubuntu 24.04 运行《文明5》游戏,解决游戏中文设置的问题!

Linux ubuntu 24.04 运行《文明5》游戏&#xff0c;解决游戏中文设置的问题&#xff01; 《文明5》是一款回合制经营策略游戏&#xff0c;拼的就是科技发展速度&#xff0c;点的是科技树&#xff0c;抢的就是科技制高点&#xff0c;但是真的是时间漫长&#xff0c;可能需要好几…

会“坐”电梯,能避障碍,AGV无人搬运车进入各行各业

AGV 近年来&#xff0c;自动导引车&#xff08;Automated Guided Vehicle&#xff0c;简称AGV&#xff09;作为一种先进的物流设备&#xff0c;在制造业中广泛应用。AGV是一种能够自主行驶的无人驾驶车辆&#xff0c;通过内置的导航系统和传感器&#xff0c;实现对环境的感知与…

keepalived总结

一、概述 定义&#xff1a;Keepalived是一个用于实现服务器高可用性和负载均衡的软件&#xff0c;通过VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虚拟路由器冗余协议&#xff09;实现故障转移。主要功能&#xff1a; 高可用系统网络服务&#xff1a;能够…

leetcode:1512. 好数对的数目(python3解法)

难度&#xff1a;简单 给你一个整数数组 nums 。 如果一组数字 (i,j) 满足 nums[i] nums[j] 且 i < j &#xff0c;就可以认为这是一组 好数对 。 返回好数对的数目。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1,1,3] 输出&#xff1a;4 解释&#xff1a;有 4 组好…

easyexcel--导入导出实现自定义格式转换

自定义格式 我们在数据库设计的时候经常会有枚举类型&#xff0c;如0表示普通用户&#xff0c;1表示VIP用户等&#xff0c;这在excel导入的时候&#xff0c;我们会填普通用户而不是0&#xff0c;这样就需要用到自定义格式把普通用户转换成0&#xff0c;我写了一个通用的抽象类…

【机器学习】探索机器学习在旅游业的革新之旅

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#x1f4d2;2. 机器学习在旅游需求分析中的应用&#x1f31e;用户行为数据分析&#x1f319;旅客偏好预测模型⭐…

垂直行业数字化表现抢眼 亚信科技全年利润展望乐观

大数据产业创新服务媒体 ——聚焦数据 改变商业 2024年8月14日&#xff0c;亚信科技控股有限公司&#xff08;股票代码&#xff1a;01675.HK&#xff09;公布了公司截至2024年6月30日的中期业绩。 财报数据显示&#xff0c;2024年上半年&#xff0c;亚信科技的营业收入为人民币…

传输大咖30|动漫游戏行业都在用的企业大文件传输系统

随着动漫游戏对画质的要求越来越高&#xff0c;动画、游戏数据越来越复杂&#xff0c;企业需要传输的文件也越来越庞大&#xff0c;这给动漫游戏行业的大文件传输带来了许多挑战。例如&#xff0c;文件的大小限制、传输速度、文件传输的安全性和稳定性、平台的兼容性等因素将直…

【SpringBoot】SpringBoot的运行原理

SpringBoot项目中都有一个如下的启动类。 SpringBootApplication public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class,args);} }其中SpringBootApplication是这个启动类的核心注解&#xff0c;在它下面又有三个子…

uniapp 页面跳转传参:父页面监听子页面传过来的数据

父页面 监听events事件 uni.navigateTo({url: "/components/watermark-camera",events: { // 重点重点重点重点重点重点重点重点getImages(data) { // 接收子页面抛出的 getImages 事件console.log("水印相机的照片&#xff1a;", data)}}})子页面 const …

【Harmony OS 4.0】页面路由跳转代码示例

ets/pages/Index.ets import router from ohos.router;Entry Component struct Index {State title: string Index Page;State message: string onPageShow(): void { // 页面每次显示时触发。使用aboutToAppear页面没反应。let record router.getParams() as Record<st…