AcWing第74场周赛
第一题:AcWing 4707. 最小身高差 - AcWing
分析:遍历身高数组a[N],用一个数组b[N]存储a[N]中前后两个元素的差的绝对值,最后再将第n个和第一个同学的身高差额外加进去即可。
代码实现:
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const int N = 1010;
int a[N],b[N];
int n;
int main(){
scanf("%d", &n);
for(int i = 0;i < n;i ++){
scanf("%d",&a[i]);
}
for(int i = 0;i < n - 1;i ++){
b[i] = abs(a[i] - a[i + 1]);
}
b[n - 1] = abs(a[n - 1] - a[0]);
sort(b,b + n);
printf("%d",b[0]);
return 0;
}
分析:深搜模板题,只不过从二维的变成了三维的。一共要定义六个方向的偏移量,每遍历一个格子就标记成"#"障碍物,表示已经走过,以免下次一次递归是重复走到该格子
代码实现:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 15;
int n, m, k;
char g[N][N][N];
//六个方向的偏移量
int dx[] = {1, 0, 0, -1, 0, 0};
int dy[] = {0, 1, 0, 0, -1, 0};
int dz[] = {0, 0, 1, 0, 0, -1};
int dfs(int x, int y, int z)
{
g[x][y][z] = '#';//没遍历一个格子标记一下,表示已经走过了
int res = 1;
//枚举六个方向
for (int i = 0; i < 6; i ++ )
{
int a = x + dx[i], b = y + dy[i], c = z + dz[i];
if (a < 0 || a >= n || b < 0 || b >= m || c < 0 || c >= k)//检测是否越界
continue;
if (g[a][b][c] == '#') continue;
//既没有越界也没有障碍物才递归遍历这个格子
res += dfs(a, b, c);
}
return res;
}
int main()
{
cin >> n >> m >> k;
for (int i = 0; i < n; i ++ )
for (int j = 0; j < m; j ++ )
cin >> g[i][j];
int y, z;//读入起点和终点
cin >> y >> z;
cout << dfs(0, y - 1, z - 1) << endl;
return 0;
}
Leetcode第316场周赛补题
分析:可以将每个开始时刻和结束时刻表示为从00:00开始的时间段的分钟的形式,然后再分别比较大小,如果事件1 starttime >= 事件2的 endtime ,或者工作2的 starttime 迟于工作1的 endtime 则表示两事件之间不存在冲突,输出false,否则返回true。
代码实现:
class Solution {
public:
bool haveConflict(vector<string>& event1, vector<string>& event2) {
int s1,e1,s2,e2;
s1 = (event1[0][0] - '0') * 600 + (event1[0][1] - '0') * 60 + (event1[0][3] - '0') * 10 + (event1[0][4] - '0');//事件1开始时间
e1 = (event1[1][0] - '0') * 600 + (event1[1][1] - '0') * 60 + (event1[1][3] - '0') * 10 + (event1[1][4] - '0');//事件1结束时间
s2 = (event2[0][0] - '0') * 600 + (event2[0][1] - '0') * 60 + (event2[0][3] - '0') * 10 + (event2[0][4] - '0');//事件2开始时间
e2 = (event2[1][0] - '0') * 600 + (event2[1][1] - '0') * 60 + (event2[1][3] - '0') * 10 + (event2[1][4] - '0');//事件2结束时间
if(s1 > e2||s2 > e1)return false;
else return true;
}
};
第二题:2447. 最大公因数等于 K 的子数组数目 - 力扣(LeetCode)
分析:利用双指针遍历数组和计数,不过内存和时间都不强。左指针指向每个子数组的起始位置,右指针右移过程中加上条件判断,若左指针指向的值就为k的话,cnt ++。在右指针往后移动过程中,需要用一个整型变量a维护右指针前的一个数nums[ i ],判断a与右指针所指元素的最大公因数是否为k,是的话就cnt ++,然后每次循环更新一遍a。
代码实现:
class Solution {
public:
int subarrayGCD(vector<int>& nums, int k) {
int cnt = 0;
for(int i = 0;i < nums.size();i ++){
if(nums[i] == k) cnt ++;
int a = nums[i];
for(int j = i + 1;j < nums.size();j ++){
a = gcd(nums[j],a);
if(gcd(nums[j],a) == k){
cnt ++;
}
}
}
return cnt;
}
};
博客对AcWing第74场周赛和Leetcode第316场周赛补题进行分析。AcWing周赛涉及最小身高差和立方体问题,分别用遍历数组和深搜解决;Leetcode周赛补题包括判断事件冲突和求最大公因数等于K的子数组数目,通过时间转换和双指针遍历求解。

573

被折叠的 条评论
为什么被折叠?



