算法笔记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;
    }
};
相关推荐
OopspoO17 分钟前
我的博客同步
笔记
沐墨专攻技术2 小时前
一、项目初始化
笔记·学习
雾岛听蓝2 小时前
Linux文件系统:从硬件到软硬链接
linux·经验分享·笔记
@蓝莓果粒茶3 小时前
OpenClaw 最终安装指南:Windows 下用 WSL2 + Ubuntu 跑通源码版
笔记·ai
左左右右左右摇晃4 小时前
K8s笔记整理
笔记
Rhystt4 小时前
斑马问题|离散数学|爱因斯坦的谜题你能解开吗?
经验分享·笔记
ouliten4 小时前
C++笔记:std::numeric_limits
c++·笔记
承渊政道4 小时前
C++学习之旅【C++伸展树介绍以及红黑树的实现】
开发语言·c++·笔记·b树·学习·visual studio
IT界的老黄牛4 小时前
【IT老齐230 笔记 + 思考】金融业容灾方案“两地三中心“是什么意思?
数据库·笔记·架构
testresultstomorrow5 小时前
GitHub 代码上传与故障排除实战指南
经验分享·笔记·开源·github