官方题解 | 欢乐赛#69题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
题目编号 题目名称 题目难度 T1 皓仔的颜文字 入门 T2 皓仔的地理课 入门 T3 皓仔的字符变换 入门 T4 皓仔的螺旋遍历 入门 T5 皓仔的单调质数求和 普及- T6 皓仔的最优抉择 普及-
T1 皓仔的颜文字
题目大意
按照输出样例, 输出 333 行颜文字。
题解思路
输出三行颜文字,使用 endl 进行换行即可。
参考代码
T2 皓仔的地理课
题目大意
皓仔正在学习地理知识,今天的内容是根据降水量进行地理区域的划分:
一个地区根据一年的总降水量(单位:毫米)可以划分成湿润区,半湿润区,半干旱区以及干旱区。
给出某地区全年的总降水量(单位:毫米),要求他根据降水情况判断该地区属于哪一种地理类型。
题解思路
多分支结构练习题,使用连续的 if-else-if 进行多分支判定:
当全年总降水量 ≥800mm\ge 800mm≥800mm 时, 判定为湿润区,
否则当 400mm≤400mm\le400mm≤全年总降水量时,判定为半湿润区,
否则当200mm≤200mm\le200mm≤ 全年总降水量时,判定为半干旱区,
否则该地区为干旱区。
参考代码
T3 皓仔的字符变换
题目大意
给定一个字符串 sss ,以及一个整数 xxx。
对于字符串的每个字符 ccc,进行如下操作:
1. 将字符 ccc 的编码值加上 xxx,得到一个新字符;
2. 如果这个新字符属于以下三类之一:
* 数字字符 0 到 9
* 大写字母 A 到 Z
* 小写字母 a 到 z
那么输出该新字符;
3. 否则输出 -1。
题解思路
本题在输入字符串 sss 之后,直接遍历其中的每一个字符 ccc. 对于变化之后的结果 c+xc + xc+x, 判定是否属于字母或者数字,只要属于其中之一,那么输出对应的字符 char(c + x), 记得写类型转换以字符的形式输出。而如果不属于其中之一,则直接输出 -1 即可。
参考代码
T4 皓仔的螺旋遍历
题目大意
对于一个 n×nn \times nn×n 的二维数组 aaa,按照从外圈到内圈,一圈一圈访问,输出路径上所有的点。
具体来说,先输出最外层一圈:从左上角开始,先向右走,再向下走,再向左走,最后向上走。
输出完最外层后,再继续输出下一层,直到所有元素都被输出恰好一次。
题解思路
本题最直接的思路就是可以对于每一圈单独用四个循环来进行输出,分别输出这一圈的上边,右边,下边以及左边。
但是此类题目有更为方便的解决方法,也就是模拟螺旋遍历的路径。注意到遍历的方向是向右,向下,向左,向上,四个方向不断循环。
因此可以建立方向数组存储四个方向,按照当前方向不断前进,当前方已经超出了地图外,或者是已经经过的点,则改变到下一个方向继续前进,一直到完整地经过了 n2n^2n2 个点。
参考代码
T5 皓仔的单调质数求和
题目大意
一个正整数被称为“单调质数”,当且仅当它同时满足以下两个条件:
* 它是一个质数;
* 它的十进制表示中,从左到右每一位数字单调不减。
请你计算从 111 到 nnn 之间所有“单调质数”的总和。
题解思路
本题的数据范围不大,因此可以直接遍历 111 到 nnn,判定该数字是否是单调质数,累加进答案中。
判定质数的方法可以直接使用试除法,复杂度 O(sqrt(n))O(sqrt(n))O(sqrt(n)),
判定是否是单调数字,则可以进行数位分解判定,从低位到高位数位分解的过程中,观察是否每次分解出来的数字都大于等于前一位,复杂度 O(logn)O(logn)O(logn)。
参考代码
T6 皓仔的最优抉择
题目大意
给定一个第 iii 轮操作都会给出两个整数 yiy_iyi 和 ziz_izi ,每次必须从下面两种方式中选择一种执行:
* 将当前数字变为 x+yix+y_ix+yi
* 将当前数字变为 x×zix \times z_ix×zi
每一轮进行二选一使得最终手中的数字尽可能大。
由于最终结果可能非常大,你只需要输出最大结果对 109+710^9+7109+7 取模后的值。
题解思路
本题的一个容易踩坑的点是,不应该使用取模之后的数字直接用来进行加法和乘法的计算,可能会做出错误的选择。
我们可以使用一个变量 sss 来保存到目前为止的最大值, 虽然最大值会远远超出 int 的范围,但是由于数据范围不超过 10610^6106, 因此可以将 sss 的上限设定为 10610^6106, 不会影响我们的正确抉择:
对于乘法来说: 乘以 000 或者乘以 111 都是没有意义的,而乘以 222 意味着翻倍。 当 sss 的值大于 10610^6106 时,就可以保证乘法的收益大于等于加法。
因此我们只需要每次比较 s+ys + ys+y 和 s×zs \times zs×z 哪一个更大,即可得到合理的答案,记得每一次运算都要取模。
参考代码