强化训练:day5(游游的you、腐烂的苹果、孩子们的游戏(圆圈中最后剩下的数)

前言

  本章内容:游游的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;
    }
};

总结

  又是体会到画图的便捷性的一天……,画图是我们解决困难问题的一个非常强大的帮手,它能帮助我们仔细的观察到问题变化过程中的很多细节,比起我们只用大脑空想强的多。
  那么第五天的内容就到此结束了,如果大家发现有什么错误的地方,可以私信或者评论区指出喔。我会继续坚持训练的,希望能与大家共同进步!!!那么本期就到此结束,让我们下期再见!!觉得不错可以点个赞以示鼓励!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不如小布.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值