算法笔记day02

目录

游游的you

腐烂的苹果

孩子们的游戏


游游的you

游游的you__牛客网

这里需要注意 oooo 是3分而不是两分。

算法思路:

拼出you可以得2分,先拼出所有的you,在将所有的o拼在一起即可。

选3个字母个数最小的就是能拼出you的个数。

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
    int q = 0;
    cin >> q;
    for(int i = 0; i < q; i++)
    {
        int a = 0, b = 0, c = 0;
        cin >> a >> b >> c;
        int m = min(a, min(b,c));//找到三个数中字母最少的个数,就是能拼出you的个数
        int n = b - m;//剩余o的个数
        cout <<2 * m + max(n-1,0) <<endl; //一个you是2分,oo是1分 ooo是2分 oooo是3分依次类推
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

腐烂的苹果

腐烂的苹果_牛客题霸_牛客网

算法思路:

这是一道多源的bfs题,

找到所有的烂苹果,遍历一遍数组,将所有的烂苹果位置入队列。

ret是传染的时间,每当ret++,队列里的烂苹果都会将周围的好苹果变为烂苹果。

传染过后烂苹果就会出队列,变为烂苹果的位置就会入队列。

最后遍历一遍数组,看有没有没被传染过的位置,如果有就返回-1 。

cpp 复制代码
class Solution {
public:

    int m = 0, n = 0;//数组的长款
    bool vis[1010][1010] = { 0 };//标记烂苹果的位置
    int dx[4] = {0, 0, 1, -1};//向量数组,访问上下左右
    int dy[4] = {1, -1, 0, 0};

    int rotApple(vector<vector<int> >& grid) 
    {
        //将所有的烂苹果放到一个队列里,时间++,扩散一次
        m = grid.size(), n = grid[0].size();
        queue<pair<int, int>> q;

        for(int i = 0; i < m; i++)//找到所有烂苹果入队列
        {
            for(int j = 0; j < n; 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 k = 0; k < 4; k++)
                {
                    int x = a + dx[k], y = b + dy[k];
                    if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y] == 1)
                    {
                        q.push({x,y});
                        vis[x][y] = true;
                    }
                }
       
            }
            
        }
        for(int i = 0; i < m; i++)
        {
            for(int j = 0; j < n; j++)
            {   
                if(grid[i][j] == 1 && !vis[i][j])
                return -1;
            }
        }

        return ret - 1;
    }
};

孩子们的游戏

孩子们的游戏(圆圈中最后剩下的数)_牛客题霸_牛客网

题目解析:

这是一个约瑟夫环的问题。

使用动态规划来解决这个问题

1.状态表示

dp[i]:表示i次报数,该删除的位置。

2.状态转移方程

i-1次删除,删除的位置是dp[i-1],下次删除的位置就是dp[i-1] + 1 + (m - 1),

找到最后一次删除的下标就是,最后获胜的小朋友

cpp 复制代码
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @param m int整型 
     * @return int整型
     */
    int LastRemaining_Solution(int n, int m) 
    {
        int f = 0;
        for(int i = 2; i < n; i++)
        {
            f = (f + m) % i;
        }
        return f;
    }
};
相关推荐
烧火大爷9 分钟前
现代计算机图形学Games101入门笔记(三)
笔记
人类恶.25 分钟前
C 语言学习笔记(数组)
c语言·笔记·学习
夏季疯27 分钟前
学习笔记:黑马程序员JavaWeb开发教程(2025.4.7)
java·笔记·学习
麟城Lincoln2 小时前
【Linux笔记】nfs网络文件系统与autofs(nfsdata、autofs、autofs.conf、auto.master)
linux·网络·笔记·nfs·autofs
田梓燊4 小时前
数学复习笔记 12
笔记·线性代数·机器学习
愚润求学4 小时前
【Linux】进程间通信(一):认识管道
linux·运维·服务器·开发语言·c++·笔记
霸王蟹4 小时前
React中useState中更新是同步的还是异步的?
前端·javascript·笔记·学习·react.js·前端框架
霸王蟹4 小时前
React Hooks 必须在组件最顶层调用的原因解析
前端·javascript·笔记·学习·react.js
珊瑚里的鱼4 小时前
【滑动窗口】LeetCode 1658题解 | 将 x 减到 0 的最小操作数
开发语言·c++·笔记·算法·leetcode·stl
请你喝好果汁6417 小时前
Jupyter Notebook 配置学习笔记
笔记·学习·jupyter