【刷题汇总--游游的you、腐烂的苹果、孩子们的游戏(圆圈中最后剩下的数)】

C++日常刷题积累

  • 今日刷题汇总 - day005
    • 1、游游的you
      • 1.1、题目
      • 1.2、思路
      • 1.3、程序实现 - 蛮力法
      • 1.4、程序实现 - 贪心(优化)
    • 2、腐烂的苹果
      • 2.1、题目
      • 2.2、思路
      • 2.3、程序实现 - bfs
    • 3、孩子们的游戏(圆圈中最后剩下的数)
      • 3.1、题目
      • 3.2、思路
      • 3.3、程序实现 -- 环形链表
      • 3.4、程序实现 -- 约瑟夫环(动态规划法)
    • 4、题目链接

今日刷题汇总 - day005

1、游游的you

1.1、题目

在这里插入图片描述
在这里插入图片描述

1.2、思路

读完题知道,属于是贪心加模拟类的题型,那么肯定要满足you次数最多,再拼接oo满足最大分数的思想。其次,蛮力法我也写了,不过超出题目限制的空间范围了,思路就是按照题目模拟即可直接贴出来就不多说了。接下来,结合预处理方式,实现贪心的思路,既然我们需要you最大化,那么贪心的思想就是求you的最大次数,观察示例可知,you的次数是同时消耗a,b,c的次数,所以you的最大次数等于a,b,c中的最小值,其次,值得注意的是oo是1分,而ooo是2分,oooo是3分,可以推出oo的最大分数为b-1次数。然后,我们会先拼接you,会同时消耗b,那么oo最大分数就变成了b减去拼接you用掉o的次数,再-1即可。所以,最后的最大分数就等于you + oo的分数。接下来,具体看程序实现。

1.3、程序实现 - 蛮力法

就是模拟实现,过程略。

#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>
#include <stack>
using namespace std;int main() {stack<int> y;stack<int> o;stack<int> u;int q = 0;int a = 0;int b = 0;int c = 0;cin >> q;while (q--) {cin >> a >> b >> c;while (a) {y.push(a--);}while (b) {o.push(b--);}while (c) {u.push(c--);}int you = 0;while (!y.empty() && !o.empty() && !u.empty()) {y.pop();o.pop();u.pop();you += 2;}while (!y.empty()) {y.pop();}int oo = 0;int m = 0;int flag = 0;while (!o.empty()) {flag = 1;o.pop();m++;}if (flag) oo = m - 1;else oo = m;while (!u.empty()) {u.pop();}cout << (you + oo) << endl;}return 0;
}

在这里插入图片描述

在这里插入图片描述

1.4、程序实现 - 贪心(优化)

首先,按照题目要求,编写输入q表示访问次数,也就是a,b,c的输入次数,那么采用预处理方法,输入一次处理一次。

#include <iostream>
using namespace std;int main()
{int q = 0;cin >> q;int a,b,c;while(q--){}return 0;
}

接着,处理a,b,c和you与oo的次数与分数的关系。定义变量you统计当前预处理的a,b,c中you的分数,通过上述思路分析思考得知,you的最大分数就等于a,b,c的最小次数乘以2(2表示的是它的分之),即:you最大分数 = 次数 X 分值即可。同理,思路中分析得知,oo具有b-1的性质,且you会消耗o的次数即b的次数,即:oo的最大分数,定义变量ooo = b - 1 - (you/2)即可。最后,输出每一次预处理的结果you + ooo即可。

#include <iostream>
using namespace std;int main()
{int q = 0;cin >> q;int a,b,c;while(q--){cin >> a >> b >> c;int you = min(a,min(b,c)) * 2;int ooo = max(b-(you/2)-1,0);cout << (you + ooo) << endl;}return 0;
}

在这里插入图片描述

2、腐烂的苹果

2.1、题目

在这里插入图片描述

2.2、思路

读完题,第一反应就是之前写过的dfs算法思路,再次理解题目要求,0,1,2分别表示空格、好苹果、坏苹果且是随机的(多个2,多个0,多个1),然后一样四个方向每分钟(理解为一次操作)进行传播(可以理解为搜索),然后求多少次传播操作后没有好苹果,或遍历完后传播不到的好苹果的情况返回-1即可。然后,再根据示例分析,这里适用dfs是不适用的,属于是一圈一圈的传播,而不是一个一个的,那么这里需要用到多源bfs思路。也就是需要满足同时一次操作对于多个坏苹果2进行它周围传播的情况,那么我们可以把同一次操作中所有的2坏苹果放进一个队列里,就可以实现每一次出队列就可同时操作多个2坏苹果,其次,每一次操作就是一次传播所以用一个变量count记录坏苹果传播的次数,但是注意的是外层传播时注意边界控制。然后,传播到空格0,不管,传播到1好苹果则,将1置为2或者标记为已传播(我这里才用标记),然后继续把这个被传播的好苹果标记后,进入坏苹果队列,继续排序传播即可。遍历传播结束后,最后再遍历二维数组判断是否还有1好苹果,则返回-1即可,否则输出count传播次数。
由于不好理解,我简单画个图,便于理解:
在这里插入图片描述
在这里插入图片描述
接下来,就是程序实现。

2.3、程序实现 - bfs

首先,按照采用bfs思路的需求,编写需要的方向数组dx和dy,定义m,n计算二维数组的大小方便执行遍历(访问)操作,其次,这里采用布尔类型数组vis标记法表示是否已传播,然后定义坏苹果队列badapple,这里pair<int,int>因为需要的下标所以是用pair存放坏苹果的行和列即可。然后,遍历二维数组将坏苹果进队列。

class Solution
{int m,n;int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};bool vis[1001][1001] = {false};queue<pair<int,int>> badapple;public:int rotApple(vector<vector<int> >& grid){n = grid.size();m = grid[0].size();for(int i = 0;i < n;i++){for(int j = 0;j<m;j++){if(grid[i][j] == 2)badapple.push({i,j});}}
};

接着,创建count计数传播次数,因为是相邻之间的传播所以可以利用传播次数就是输出结果。
然后,只要队列中有坏苹果则执行传播,即出一层坏苹果且用sz保存当前这一层有几个坏苹果,以便依次执行上下左右的传播操作,即有多少个坏苹果就执行多少次传播,实现模拟同时一层坏苹果的传播。然后if(x >=0 && x < n && y >=0 && y < m && grid[x][y] == 1 && !vis[x][y]),进行边界控制防止出界且为好苹果且未被标记,则将它标记为已传播,再将它进队列,成为理解的下一层将要传播得坏苹果之一,等待sz次后,完成所有得第二层坏苹果,依次类推,直到传播结束。

class Solution
{int m,n;int dx[4] = {0,0,1,-1};int dy[4] = {1,-1,0,0};bool vis[1001][1001] = {false};queue<pair<int,int>> badapple;public:int rotApple(vector<vector<int> >& grid){n = grid.size();m = grid[0].size();for(int i = 0;i < n;i++){for(int j = 0;j<m;j++){if(grid[i][j] == 2)badapple.push({i,j});}}int count = 0;while(badapple.size()){count++;int sz = badapple.size();while(sz--){auto [a,b] = badapple.front();badapple.pop();for(int k = 0; k < 4;k++){int x = a + dx[k];int y = b + dy[k];if(x >=0 && x < n && y >=0 && y < m && grid[x][y] == 1 && !vis[x][y]){vis[x][y] = true;badapple.push({x,y});}                  }}}}
};

传播结束有两种情况,要么当前层的所有坏苹果的下一次传播单元(数组下标)都是空格0,要么就是全部坏苹果被传播完毕(遍历完)。最后,只需要再次遍历这个二维数组判断是都还有未被感染的好苹果且为被标记,有则返回-1,否则就是输出count-1即可。

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

在这里插入图片描述

在这里插入图片描述

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

3.1、题目

在这里插入图片描述

3.2、思路

读完题,立马知道了属于是之前写过的杨辉三角问题同样经典的约瑟夫环问题了。题目意思跟大家熟悉的数字炸弹游戏类似的规则,首先需要一个随机数m,然后这里是按照从0开始报数,让其后报数为m-3的小朋友退出,直到剩下最后一个小朋友即可。那么,对于约瑟夫问题可以采用蛮力法模拟实现,我这里就是使用环形链表来实现,其次还可以通过像利用杨辉三角的性质(状态方程)一样,结合约瑟夫环的规律递推(动态规划)求解。首先,链表方法,由于题目中已知小朋友的编号是有序的0~n-1,所以直接先让其进链表即可,然后判断m-1位置时,让其该位置释放掉即可,直到剩下最后一个小朋友的编号输出即可。值得注意的是需要处理一些细节等,如需要让被释放的位置的下一个位置作为计数的开始,所以需要一个it变量记录,变化的计数位置(可以巧妙的利用迭代器)。
然后,对于递推(动态规划法),跟之前写过的最小花费爬楼梯套路是一样的需要确定动态规划的状态表示以及状态转移方程。那么就来推理dp[i]和dp[n],为了方便理解画个图理解:
在这里插入图片描述

3.3、程序实现 – 环形链表

首先,我们建立链表,将编号插入链表。

class Solution {public:int LastRemaining_Solution(int n, int m){list<int> lt;for (int i = 0; i < n; i++){lt.push_back(i);}}
};

然后,我们利用迭代器变量it,记录按照规则走的位置,走到m-1位置处,直接用it.erase删除释放即可,值得注意的是,当调用 lt.erase(it) 删除元素后,返回的迭代器是指向被删除元素之后的那个元素的迭代器。因此,在删除元素后,不需要再手动将 it 设置为 lt.begin(),因为 it 已经自动更新为指向下一个元素的迭代器(如果存在的话)。所以,在删除元素后直接进行下一次循环即可。
另外,如果实现的循环呢?判断it遍历到end处就使它置begin位置即可。所以链表模拟相对于数组模拟,迭代器相对更好用。依次类推,遇见m-1就删除,直到链表中剩下一个编号,返回即可。

class Solution {public:int LastRemaining_Solution(int n, int m){list<int> lt;for (int i = 0; i < n; i++){lt.push_back(i);}auto it = lt.begin();while (lt.size() > 1){for (int count = 1; count < m; ++count){++it;if (it == lt.end()){it = lt.begin();}}it = lt.erase(it);if (it == lt.end())it = lt.begin();}return *it;}
};

在这里插入图片描述
在这里插入图片描述

3.4、程序实现 – 约瑟夫环(动态规划法)

接着,动态规划重要的在于分析和理解,状态表示以及状态转移方程,程序就相对简单了。
在这里插入图片描述
在这里插入图片描述
接着按照推导的方程写好程序即可。只需要说一下为什么这里%上的 i,其实就是推导出的dp[n] = (dp[n-1] + m)%n;只是把n换成每一次循环求的 i 而已,表示求每一步的映射关系。

class Solution {
public:int dp[5001];int LastRemaining_Solution(int n, int m){dp[1] = 0;for(int i = 2;i <= n;i++)dp[i] = (dp[i-1] + m) % i;return dp[n];}
};

在这里插入图片描述

还可以进一步空间优化,直接控制变量即可。总结模拟就是老实的遍历删除,动态规划就是找规律,推导方程求解。

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;}
};

在这里插入图片描述
在这里插入图片描述

4、题目链接

游游的you
腐烂的苹果
孩子们的游戏(圆圈中最后剩下的数)

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

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

相关文章

2个方法教你轻松移除pdf文件编辑限制

PDF是一种常见的办公文档格式&#xff0c;常用于文件共享和保护。然而&#xff0c;有时候我们需要编辑PDF文件中的内容&#xff0c;但受到了编辑限制。本文将介绍一些有效的方法&#xff0c;帮助您解除PDF的编辑限制&#xff0c;轻松进行编辑和修改。 一、通过密码取消PDF“限制…

雷电模拟器报错remount of the / superblock failed: Permission denied remount failed

报错截图 解决方法 打开设置 设置配置system.vmdk可写入 解决

Transformer和Mamba强强结合!最新混合架构全面开源,推理速度狂飙8倍

最近发现&#xff0c;将Mamba和Transformer模块混合使用&#xff0c;效果会比单独使用好很多&#xff0c;这是因为该方法结合了Mamba的长序列处理能力和Transformer的建模能力&#xff0c;可以显著提升计算效率和模型性能。 典型案例如大名鼎鼎的Jamba&#xff1a;Jamba利用Tr…

Python统计实战:时间序列分析之简单指数平滑和Holt指数平滑

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能&#xff0c;从而更快地掌握解决问题所需的能力。 &#xff08;以下练习题来源于《统计学—基于Python》。请在Q群455547227下载原始数据。&#xff09; 练习题 下表是某只股票…

金属3D打印如何精准选材

随着3D打印技术的飞跃发展&#xff0c;模具制造领域迎来了前所未有的创新机遇。在众多3D打印技术中&#xff0c;SLM金属3D打印以其精度高、复杂结构成型能力&#xff0c;成为众多行业的优选。然而&#xff0c;金属打印材料&#xff0c;如何精准选择&#xff0c;以最大化满足项目…

linux 内核打印log太多咋办?

有时候发现&#xff0c;linux 内核打印太多消息了&#xff0c;对有用消息造成了干扰&#xff0c;如果你一个个源文件去关闭打印太麻烦了&#xff0c;有没有一种更方便的方式来关闭这些消息呢&#xff1f; 对这个需求&#xff0c;内核提供了一个强大而又灵活的方式&#xff0c;…

用html+css设计一个列表清单小卡片

目录 简介: 效果图: 源代码: 可能的问题: 简介: 这个HTML代码片段是一个简单的列表清单设计。它包含一个卡片元素(class为"card"),内部包含一个无序列表(ul),列表项(li)前面有一个特殊的符号(△)。整个卡片元素设计成300px宽,150px高,具有圆角边…

20.【C语言】初识结构体(重要)

定义&#xff1a;由一批数据组合而成的结构型数据 作用&#xff1a;描述复杂对象&#xff0c;创建新的类型 格式&#xff1a; struct 对象 { …… } 介绍. 用法&#xff1a;结构体变量.成员变量 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> struct hotal…

Prompt-Free Diffusion: Taking “Text” out of Text-to-Image Diffusion Models

CVPR2024 SHI Labshttps://arxiv.org/pdf/2305.16223https://github.com/SHI-Labs/Prompt-Free-Diffusion 问题引入 在SD模型的基础之上&#xff0c;去掉text prompt&#xff0c;使用reference image作为生成图片语义的指导&#xff0c;optional structure image作为生成图片…

安装Linux虚拟机

点击创建新的虚拟机 选择高级 系统自定义推荐 选择稍后安装 选择Linux 虚拟机命名并且选择创建位置 系统自定义 系统自定义推荐 系统自定义推荐 选择安装好的iOS文件 点击完成 选择编辑虚拟机设置 进入后选择第一个Install red hat enterprise 选择常用语言 设置…

2024.8月28号杭州电商博览会,在杭州国博举办

2024杭州电商新渠道博览会暨集脉电商节 时间&#xff1a;2024年08月28-30日 地点&#xff1a;杭州国际博览中心&#xff08;G20&#xff09; 主办单位&#xff1a;浙江集脉展览有限公司、杭州华维展览有限公司 承办单位&#xff1a;浙江集脉展览有限公司 报名参展&#xf…

测试几个 ocr 对日语的识别情况

测试几个 ocr 对日语的识别情况 1. EasyOCR2. PaddleOCR3. Deepdoc&#xff08;识别pdf中图片&#xff09;4. Deepdoc&#xff08;识别pdf中文字&#xff09;5. Nvidia neva-22b6. Claude 3.5 sonnet 识别图片中的文字7. Claude 3.5 sonnet 识别 pdf 中表格8. OpenAI gpt-4o 识…

网页计算器的实现

简介 该项目实现了一个功能完备、交互友好的网页计算器应用。只使用了 HTML、CSS 和 JavaScript &#xff0c;用于检验web前端基础水平。 开发环境&#xff1a;Visual Studio Code开发工具&#xff1a;HTML5、CSS3、JavaScript实现效果 功能设计和模块划分 显示模块&#…

anaconda命令大全

目录 查看所有虚拟环境查看某虚拟环境安装的包创建虚拟环境激活创建好的虚拟环境回到之前的环境删除创建的虚拟环境查看conda所在的位置、虚拟环境位置等信息conda修改虚拟环境所在的位置 查看所有虚拟环境 conda env list查看某虚拟环境安装的包 激活要查看的虚拟环境之后&a…

Android 性能优化之启动优化

文章目录 Android 性能优化之启动优化启动状态冷启动温启动热启动 耗时检测检测手段TraceView使用方式缺点 Systrace环境配置使用方式TraceView和Systrace比较 AOP统计耗时环境配置使用 优化白屏优化异步加载优化环境配置使用 延迟加载优化AppStartup 源码下载 Android 性能优化…

Reid系列论文学习——无人机场景下基于 Transformer 的轻量化行人重识别

今天介绍的一篇论文是针对无人机场景下的行人重识别&#xff0c;论文题目为&#xff1a;"无人机场景下基于 Transformer 的轻量化行人重识别"。该论文针对无人机场景下行人呈现多角度多尺度的特点、以及传统CNN网络在行人重识别任务中受限于感受野和下采样导致的无法…

关于汽车软件测试的几点想法

如果你有过汽车行业的从业经验&#xff0c;你就应该知道&#xff0c;过去汽车行业只做测试&#xff0c;而不做开发。汽车制造商的主要任务&#xff08;从工程角度看&#xff09;是将来自数百家供应商的数千个零部件组装在一起。考虑到现代软件的复杂性和客户的“挑剔”&#xf…

Rufus 制作启动盘 | 便携的工作空间

唠唠闲话 最近服务器硬盘故障多&#xff0c;在修复过程中&#xff0c;学习了一些操作&#xff0c;这里做个记录。本期主要介绍 U盘启动盘的制作&#xff0c;以及持久化存储。 U 盘启动盘 镜像选择 Ubuntu 的版本命名遵循 “Adjective Animal” 的模式&#xff0c;即 “形容…

新港海岸NCS8822 低功耗DP转VGA 分辨率支持1920*1200*60HZ

NCS8822描述&#xff1a; NCS8822是一个低功耗显示端口到vga转换器。NCS8822集成了一个与DP1.2兼容的接收器和一个高速三通道视频DAC。对于DP1.2输入&#xff0c;NCS8822支持1车道/2车道&#xff0c;也支持车道交换功能。对于VGA输出NCS8822&#xff0c;在60Hz帧率下对WUXGA&a…

C++ 栈-队列-优先级队列

目录 1 栈 2 队列 3 deque 介绍 4 优先级队列 5 反向迭代器 栈也是我们在C语言就模拟实现过的一种数据结构&#xff0c;在C中&#xff0c;栈其实和我们前面模拟实现过的string、vector等容器有一点区别&#xff0c;站起是不是容器&#xff0c;而是一种容器适配器&#xff0c;我…