当前位置: 首页 > article >正文

算法笔记day02

目录

游游的you

腐烂的苹果

孩子们的游戏


游游的you

游游的you__牛客网

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

算法思路:

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

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

#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 。

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),

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

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;
    }
};


http://www.kler.cn/news/340512.html

相关文章:

  • 【C语言】常见概念
  • 【C++】空指针和野指针
  • JavaScript APIs
  • Next.js 详解
  • tp8 验证码如何访盗刷
  • 八股文面试题总结(包含主流的面试经典题)
  • Oracle 表空间异构传输
  • Spring Boot集成RBloomFilter快速入门Demo
  • 【无标题】获取网页文本
  • OpenJudge | Disk Tree
  • vue 条件渲染
  • Python的pandas库基本操作(数据分析)
  • 【LeetCode: 344. 反转字符串 | 双指针模拟】
  • Golang 进阶1 —— 面向对象
  • 图的最短路径算法
  • threads_created增加过大?
  • TLS 加密的原理和过程
  • C++实现字符串 trim,C++实现字符串split, C++如何分割字符串为数组,C++如何去除字符串两边的空格
  • (笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第3关---浦语提示词工程实践
  • 如何使用pymysql和psycopg2执行SQL语句