笔试练习day5

news2024/9/21 20:34:29

目录

  • 游游的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.coloradmin.cn/o/2055697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CORS error 302 Found

CORS error && 302 Found 场景 单点登录认证&#xff1a;访问A系统&#xff0c;在B系统登录认证 此处代码为A系统 controller ResponseBodyGetMapping("/idp/loginCheck")public void loginCheck(HttpServletRequest request, HttpServletResponse httpR…

基于vue框架的爱学习分享平台ud317(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,学科分类,交流答疑,论坛交流,学习资料 开题报告内容 基于Vue框架的爱学习分享平台 开题报告 一、项目背景与意义 随着互联网技术的飞速发展&#xff0c;知识的获取与传播方式正经历着前所未有的变革。在线教育平台逐渐成为满足…

【独立站搭建经验分享】B2C独立站如何搭建?怎么推广?

如果你的产品有C端属性&#xff0c;可能你就需要考虑建一个B2C独立站&#xff0c;用来满足访客的浏览和在线下单。那么B2C独立站应该怎么搭建&#xff0c;选择什么推广方式&#xff0c;这个前期最好有一些基本了解&#xff0c;本篇内容可以针对你最关心的问题进行讲解&#xff…

【文献】3D Gaussian Splatting for Real-Time Radiance Field Rendering

论文地址&#xff1a;https://arxiv.org/abs/2308.04079 项目&#xff1a; https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/ 代码&#xff1a; git clone https://github.com/graphdeco-inria/gaussian-splatting —recursive 一、文章概述 1.问题导向 辐射场…

《笑谈设计模式》 — 23种尝鲜版(未完待续......

引子&#xff1a;无论在平时开发过程中&#xff0c;还是深夜研读源码亦或者面试时都对遇到——设计模式。比如说Spring中的单例模式&#xff08;bean单例&#xff09;、工厂模式&#xff08;bean创建&#xff09;、代理模式&#xff08;动态代理&#xff09;、策略模式等。我们…

RTA-VRTE适配Orin

RTA-VRTE适配Orin sudo minicom -w -D /dev/ttyACM0 用户名 nvidia密码 123456底下的的rj45 ,对应的是eqos_0, (本次porting使用该接口)底下的的DEBUG(USB Micro-B)串口连接(本次porting使用该接口)上侧边的rj45,对应的是mgbe0_0#设置Orin的IP和默认网卡eqos_0

C语言:一维、二维数组详解

目录 一、数组的概念 二、一维数组创建和初始化 2.1 数组创建 2.2 数组的初始化 2.3 数组的类型 三、一维数组的使用 3.1 数组的下标 3.2 数组的输入与输出 四、⼀维数组在内存中的存储 五、sizeof计算数组元素个数 六、二维数组 6.1 二维数组的概念 6.2 二维数组…

虚幻游戏开发 | shader性能优化

如何查看shader性能消耗 1.Alt 8切换Shader Complexity mode查看shader性能消耗 (Alt 4切换回Lit Mode正常光照模式) 2.材质蓝图里查看instructions数量&#xff08;如图中箭头所示&#xff09; 3.直接在target platform上测试是最准确的。 &#xff08;running fewer instru…

思特科技案例:北京欢乐谷光影乐园

01      在北京欢乐谷的亲子领域&#xff0c;藏着一处“面积近400平米&#xff0c;炫酷堪比魔法世界的、美轮美奂的光影空间&#xff0c;做到了“让娃来了不想走&#xff0c;一玩就是一下午”。    思特科技案例&#xff1a;北京欢乐谷光影乐园      02      作…

去抖音视频水印的软件免费推荐,精选四款实用工具助你轻松去除水印

随着抖音等短视频平台的流行&#xff0c;我们常常会遇到想要保存某些视频但不想保留水印的情况。本文将为您推荐四款去抖音视频水印的实用工具&#xff0c;帮助您轻松去除视频中的水印&#xff0c;保存清晰的内容。 工具一&#xff1a;奈斯水印助手(小程序) 推荐指数&#xf…

DMDSC学习

DMDSC学习 ​ DM 共享存储数据库集群&#xff0c;允许多个数据库实例同时访问、操作同一数据库&#xff0c;具有高可用、高性能、负载均衡等特性。DMDSC 支持故障自动切换和故障自动重加入&#xff0c;某一个数据库实例故障后&#xff0c;不会导致数据库服务无法提供。 DMDSC…

前端使用miniO上传文件

项目背景:vue2&#xff0c;前提是请先安装miniO,若安装引入时报错&#xff0c;那就是版本不对&#xff0c;通常指定版本安装即可。 页面样式&#xff1a; 前端vue页面代码&#xff1a; //<el-form>表单中:<el-form-item label"文件" prop"fileIds&q…

链表OJ题——反转一个单链表

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 原地翻转链表 二、解题思路 原地翻转链表&#xff0c;空间复杂度为O(1)&#xff0c;时间复杂度O(n) 三、解题代码

亲测好用,吐血整理 ChatGPT 3.5/4.0 新手使用手册~ 【2024 更新】

废话不多说&#xff0c;直接分享正文~ 以下是小编为大家搜集到的最新的ChatGPT国内站&#xff0c;各有优缺点。 1、AI Plus&#xff08;稳定使用&#xff09; 推荐指数&#xff1a;⭐⭐⭐⭐⭐ yixiaai.com 该网站已经稳定运营了1年多了。2023年3月份第一批上线的网…

高速公路边坡在线监测预警系统

一、背景 近日&#xff0c;广东梅大高速发生严重塌方事故&#xff0c;造成了严重的人员伤亡和财产损失。这一事件在公众心中敲响了安全的警钟&#xff0c;再次引起了公众对于交通设施运营安全性的重点关注。 二、系统介绍 高速公路边坡在线监测预警系统通过结合北斗、5G、AI…

jstack结果提取特定线程池线程的堆栈

这里假设你已经知道如何定位java进程PID&#xff0c;以及如何执行jstack命令进行导出&#xff0c;下面仅提供相关命令&#xff0c;及示例 ps aux|grep java jstack 8229 > jstack_output.log v1版本 grep second jstack_output.log 如果此时我们想重点关注一下下面这个线程…

极简接入|七牛云 QPlayer2 播放器再升级

1877 年&#xff0c;爱迪生发明留声机&#xff0c;用锡箔筒捕捉了第一缕声波。随后&#xff0c;黑胶唱片、磁带录音机、八轨盒式磁带机、卡式磁带、激光唱片&#xff08;CD&#xff09;等相继问世。 每一次介质的变革&#xff0c;都带来了音质的提升和便捷性的增强。时光流转&a…

LLM概念梳理(一):训练流程之PT、SFT和PO

一个LLM的成功问世&#xff0c;一般分为&#xff1a;预训练 PT监督微调 SFT偏好优化 PO。 预训练&#xff08;Pre-Training&#xff09;是为了让模型学习通用知识&#xff0c;而监督微调&#xff08;Supervised Fine-Tuning&#xff09;是为了优化模型在特定任务上的表现。为了…

TypeScript学习笔记1---认识ts与js的异同、ts的所有数据类型详解

前言&#xff1a;去年做过几个vue3js的项目&#xff0c;当时考虑到时间问题&#xff0c;js更加熟悉&#xff0c;学习成本低一点&#xff0c;所以只去了解了vue3。最近这段时间补了一下ts的知识点&#xff0c;现今终于有空来码文章了&#xff0c;做个学习总结&#xff0c;方便以…

360驱动大师 v2.0.0.2040 最新免费精简单文件版

360驱动大师是一款专注于驱动安装和更新的专业软件&#xff0c;它拥有庞大的驱动库&#xff0c;能够支持数以百万计的不同类型的驱动程序。 它的设计理念是简化驱动管理和更新的过程&#xff0c;让用户能够轻松地保持系统的最新状态&#xff0c;从而获得更好的性能和稳定性。无…