官方题解 | 欢乐赛#78题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
题目编号 题目名称 题目难度 T1 皓仔的BMI 入门 T2 皓仔的体重等级 入门 T3 皓仔的字母变换 入门 T4 皓仔的寻宝之路 入门 T5 皓仔的数组检测 普及- T6 皓仔的矩阵魔法 普及-
T1 皓仔的BMI
题意简述
给定皓仔的身高 h(单位:米)和体重 w(单位:千克)。
根据公式:
BMI=wh2BMI=\frac{w}{h^2} BMI=h2w
计算 BMI 值,并保留两位小数输出。
解题思路
直接按照公式计算即可。
注意:
* 身高是小数,需要使用 double 类型;
* 输出保留两位小数,可以使用 printf("%.2f", ans)。
时间复杂度为 O(1)O(1)O(1)。
参考代码
T2 皓仔的体重等级
题意简述
给定皓仔的身高 h 和体重 w。
先根据公式计算 BMI:
BMI=wh2BMI=\frac{w}{h^2} BMI=h2w
再根据 BMI 判断体重等级:
* BMI < 18.5:输出 偏瘦
* 18.5 <= BMI < 24:输出 正常
* 24 <= BMI < 28:输出 超重
* BMI >= 28:输出 肥胖
解题思路
先使用 double 类型读入身高和体重,并计算 BMI。
然后按照 BMI 从小到大的区间依次判断。
使用 if...else if...else 时,前面的条件不成立后,后面的判断不需要重复写左端点。
例如,判断到 bmi < 24 时,已经可以确定 bmi >= 18.5。
时间复杂度为 O(1)O(1)O(1)。
参考代码
T3 皓仔的字母变换
题意简述
给定一个字符串 s 和整数 xxx,依次处理字符串中的每个字符:
* 大写字母在大写字母表中向后移动 xxx 位;
* 小写字母在小写字母表中向前移动 xxx 位;
* 其他字符保持不变。
字母移动超过边界时,需要循环到字母表的另一端。
解题思路
英文字母表中共有 262626 个字母,因此先令 x %= 26。
遍历字符串中的每个字符:
* 如果是大写字母,可以先减去 'A',转换为 0∼250\sim250∼25 的编号,再加上 x 并对 262626 取模;
* 如果是小写字母,可以先减去 'a',转换为 0∼250\sim250∼25 的编号,再减去 x。为了避免出现负数,可以额外加上 262626 后再取模;
* 其他字符不需要修改。
时间复杂度为 O(∣s∣)O(|s|)O(∣s∣),空间复杂度为 O(1)O(1)O(1)。
参考代码
T4 皓仔的寻宝之路
题意简述
一条路线上有 mmm 个位置,每个位置都有对应的宝藏价值。
皓仔从第 x 个位置出发,按照字符串中的 L 和 R 进行 nnn 次移动:
* L 表示向左移动一格;
* R 表示向右移动一格;
* 如果移动后超出 1∼m1\sim m1∼m 的范围,则停留在原位置,并且不获得宝藏;
* 如果移动成功,则获得新位置的宝藏价值。
求皓仔最终获得的宝藏总价值。
解题思路
使用变量 x 记录皓仔当前所在的位置,依次处理每次移动:
* 遇到 L 时,判断 x - 1 是否仍在路线范围内;
* 遇到 R 时,判断 x + 1 是否仍在路线范围内;
* 如果移动成功,就更新 x,并将 a[x] 加入答案;
* 如果移动失败,则什么也不做。
起点的宝藏价值不需要加入答案。
时间复杂度为 O(m+n)O(m+n)O(m+n),空间复杂度为 O(m)O(m)O(m)。
参考代码
T5 皓仔的数组检测
题意简述
对于每组数组,分别计算:
* 下标为奇数的位置上的元素之和;
* 下标为偶数的位置上的元素之和。
如果奇数位置元素之和是质数,并且偶数位置元素之和是回文数,则输出 Yes,否则输出 No。
解题思路
读入数组时,根据当前位置的奇偶性分别累计:
* sum1 表示奇数位置元素之和;
* sum2 表示偶数位置元素之和。
然后分别进行判断:
* 判断 sum1 是否为质数。枚举 2∼sum12\sim\sqrt{\text{sum1}}2∼sum1 ,检查是否存在因数;
* 判断 sum2 是否为回文数。将其各位数字反转,判断反转后的数字是否与原数相同。
只有两个条件同时满足时,数组才是合格数组。
由于元素之和最大可能达到 101110^{11}1011,需要使用 long long 存储。
参考代码
T6 皓仔的矩阵魔法
题意简述
给定一个 nnn 行 mmm 列的矩阵,需要依次进行 qqq 次操作。
每次操作会指定一个子矩阵:
* 当 op = 1 时,将子矩阵中的所有元素加上 v;
* 当 op = 2 时,将子矩阵中的所有元素减去 v;
* 当 op = 3 时,将子矩阵中的所有元素赋值为 v。
完成所有操作后,输出最终矩阵。
解题思路
由于 n,m≤50n,m\leq50n,m≤50,q≤100q\leq100q≤100,数据范围较小,可以直接模拟每次操作。
对于每次操作,枚举子矩阵中的所有位置:
* 如果 op == 1,执行 a[i][j] += v;
* 如果 op == 2,执行 a[i][j] -= v;
* 如果 op == 3,执行 a[i][j] = v。
所有操作完成后,按行输出矩阵。
时间复杂度为 O(qnm)O(qnm)O(qnm),空间复杂度为 O(nm)O(nm)O(nm)。
参考代码