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) {//多源bfsm=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;}
};