[笔试训练](五)

013

游游的you__牛客网 (nowcoder.com)

题目:

 题解:

组成一个you需要一个o且能得2分,而组成相邻字母oo需要两个o,只能得1分。优先考虑组成尽可能多的you,再考虑剩下的o,放一起。

#include <iostream>
using namespace std;

int main() 
{
    int q;
    cin>>q;
    while(q--)
    {
        int a,b,c;
        cin>>a>>b>>c;
        int x=min(min(a,b),c);
        cout<<x*2+max(b-x-1,0)<<endl; //b-x==0时,刚好用完o
    }
    return 0;
}

014

腐烂的苹果_牛客题霸_牛客网 (nowcoder.com)

题目: 

 

 题解:

多源bfs+最短路:将每层刚腐烂的的苹果放入队列中,同时用bool二维数组标记好,再找下一层,直到相邻没有完好的苹果为止。最后遍历一遍查看有没有没有标记的完好的苹果。

class Solution {
public:
    int dx[4]={0,0,-1,1};
    int dy[4]={-1,1,0,0};
    int m,n;
    bool vis[1100][1100];
    int rotApple(vector<vector<int> >& grid) 
    {
        //多源bfs
        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 i=0;i<4;i++)
                {
                    int x=a+dx[i],y=b+dy[i];
                    if(x>=0 && x<m && y>=0 && y<n && grid[x][y]==1 && !vis[x][y])
                    {
                        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;
    }
};

015

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

题目:

题解:

1.环形链表模拟:构建好环形链表后,沿着链表边遍历边删除节点。

2.递推/递归/动态规划

dp[i]表示:有i个孩子围成一圈时,最终剩下的孩子的编号是多少

每减少一个孩子时,同一编号对应的下标会改变,改变也是有规律的,也就是下标映射,根据下标映射,可得出状态转移方程。

//环形链表
class Solution {
public:
    struct Node
    {
        int val;
        Node* next;
        Node(int x)
        :val(x)
        ,next(nullptr)
        {}
    };
    int LastRemaining_Solution(int n, int m) 
    {
        Node* head=new Node(0);
        Node* cur=head;
        for(int i=1;i<n;i++)
        {
            cur->next=new Node(i);
            cur=cur->next;
        }
        cur->next=head;

    cur = head;  
    Node* prev = nullptr;  
  
    while (cur->next != cur) {  // 至少还有两个人在环中  
        for (int i = 1; i < m; i++) {  // 报数,找到第m个人  
            prev = cur;  
            cur = cur->next;  
        }  
        prev->next = cur->next;  // 从环中删除出列的人  
        delete cur;  // 释放内存  
        cur = prev->next;  // 从下一个人开始报数  
    }  
    return cur->val;
    delete cur;  // 释放最后一个节点的内存  
    }
};



 

//动态规划
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;
    }
};
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

敲敲er

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

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

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

打赏作者

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

抵扣说明:

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

余额充值