算法笔记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;
    }
};
相关推荐
大筒木老辈子4 小时前
Linux笔记---协议定制与序列化/反序列化
网络·笔记
草莓熊Lotso4 小时前
【C++】递归与迭代:两种编程范式的对比与实践
c语言·开发语言·c++·经验分享·笔记·其他
我爱挣钱我也要早睡!7 小时前
Java 复习笔记
java·开发语言·笔记
汇能感知11 小时前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun12 小时前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
茯苓gao12 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾12 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT13 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
ST.J13 小时前
前端笔记2025
前端·javascript·css·vue.js·笔记
Suckerbin13 小时前
LAMPSecurity: CTF5靶场渗透
笔记·安全·web安全·网络安全