文章目录
- 前言
- 1. 游游的you
- 1.1 题目描述
- 1.2 解题思路
- 1.3 代码实现
- 2. 腐烂的苹果
- 2.1 题目描述
- 2.2 解题思路
- 2.3 代码实现
- 3. 孩子们的游戏(圆圈中最后剩下的数)
- 3.1 题目描述
- 3.2 解题思路
- 3.3 代码实现
- 总结
前言
本章内容:游游的you、腐烂的苹果、孩子们的游戏(圆圈中最后剩下的数)。
1. 游游的you
1.1 题目描述
1.2 解题思路
这是一道简单的模拟题,我们只需要找打三个字符中最小的个数n,也就是意味最最多能组成n个you,再用o字符的总数减去这个n,就是剩余的o的个数,如果o的个数小于2,那么就没有意义,如果大于2,比如是2的话,结果就加1,如果是3的话,结果就加2,一次类推,只需要加上剩余o的个数再减一,就是最后的结果。
1.3 代码实现
#include <iostream>
using namespace std;
int main() {
int q = 0;
cin >> q;
while (q--)
{
int a, b, c;
cin >> a >> b >> c;
int ret = min(a, min(b, c)) * 2;
int t = b - ret / 2;
if (t < 2) cout << ret << endl;
else cout << ret + t - 1 << endl;
}
return 0;
}
2. 腐烂的苹果
2.1 题目描述
2.2 解题思路
一道基础的BFS的题目,借助队列将全部符合条件的值进行一次扩展,一直到队列为空结束。
比如先循环一次,将所有符合条件的值入队列,然后从队列中一个一个取数据,进行扩展,将符合条件的结果再入队列,一直到队列为空为止。
2.3 代码实现
class Solution {
public:
int m, n;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
queue<pair<int, int>> q;
bool vis[1001][1001];
int ret;
void bfs(vector<vector<int> >& grid)
{
while (!q.empty()) {
int sz = q.size();
while (sz--)
{
auto [a, b] = q.front();
q.pop();
for (int k = 0; k < 4; k++)
{
int x = a + dx[k], y = b + dy[k];
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1) {
grid[x][y] = 2;
q.push({x, y});
}
}
}
ret++;
}
}
int rotApple(vector<vector<int> >& grid)
{
// 第一次进去不算
ret = -1;
m = grid.size(), n = grid[0].size();
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
{
if (grid[i][j] == 2)
{
q.push({i, j});
}
}
bfs(grid);
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
{
if (grid[i][j] == 1)
{
return -1;
}
}
return ret;
}
};
};
3. 孩子们的游戏(圆圈中最后剩下的数)
3.1 题目描述
3.2 解题思路
这道题如果不考虑时空复杂度的限制,还是比较好写的,可以使用环形链表或者数组的方式进行解决,但是这个题要求了空间复杂度为O(1),那么这个方法就不行了。我们来通过画图来看一下这个过程:
因此我们不难看出,求有n个人,最后获胜的是谁,实际上就是求有n-1个人最后获胜的是谁,……一直到n为1结束。而其中变化的仅仅只是下标,我们只需要找到删除元素与之前下标的映射关系即可。
这实际上就变成了解决下标映射关系的问题。对于不太理解的小伙伴,可以画图来体会一下其中的过程,这个题我一开始也是没有写出来,还是看了题解并且画图了才勉强理解一些。
对于这个过程不理解的,我强烈建议画图!!!画图!!!画图!!!重要的事情说三遍,而且在草稿本上画图比在电脑上画图方便多了,因此我是十分推荐通过画图来理解这个问题的。
3.3 代码实现
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;
}
};
总结
又是体会到画图的便捷性的一天……,画图是我们解决困难问题的一个非常强大的帮手,它能帮助我们仔细的观察到问题变化过程中的很多细节,比起我们只用大脑空想强的多。
那么第五天的内容就到此结束了,如果大家发现有什么错误的地方,可以私信或者评论区指出喔。我会继续坚持训练的,希望能与大家共同进步!!!那么本期就到此结束,让我们下期再见!!觉得不错可以点个赞以示鼓励!