目录
游游的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;
}
};