官方题解 | 欢乐赛#74题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
题目编号 题目名称 题目难度 T1 皓仔的灯牌 入门 T2 皓仔的幸运数字 入门 T3 皓仔的字符串分割 入门 T4 皓仔的藏宝地图 入门 T5 皓仔的移动距离 普及- T6 皓仔的好数统计 普及-
T1 皓仔的灯牌
题目大意
根据样例内容使用 * 号在屏幕上画出一个醒目的大写字母 X。
题解思路
定义三个变量 m,d,tm, d, tm,d,t, 用以表示月份,日期还有温度。
输出语句练习题,本题中的图案一共有 777 行, 直接逐行输出对应的内容构成一个完整的大 X 即可。
参考代码
T2 皓仔的幸运数字
题目大意
一个数字如果同时满足下面两个条件,就可以被称为“幸运数字”:
* 这个数字在 aaa 到 bbb 之间,包括 aaa 和 bbb
* 这个数字是奇数
现在给定三个整数 n,a,bn,a,bn,a,b,请你判断 nnn 是否是皓仔的幸运数字。
如果是,输出 Yes;否则输出 No。
题解思路
nnn 如果是幸运数组,则需要同时满足在 aaa 到 bbb 之间并且是奇数。那么可以拆解成同时满足以下三点:
* n>=an >= an>=a
* n<=bn <= bn<=b
* n%2!=0n \% 2 != 0n%2!=0 注意此处不能写 n%2==1n \% 2==1n%2==1 , 因为本题输入纯在负数奇数, 负数的取余结果也为负数,因此负奇数对 222 取余数之后的结果为 −1-1−1 。
三个条件需要同时满足,因此本题中成为幸运数字的条件为 n >= a && n <= b && n % 2 != 0, 条件为真输出 Yes, 否则输出 No 。
参考代码
T3 皓仔的字符串分割
题目大意
给定一个字符串,要求先删除所有不是字母的字符,然后:
接着,皓仔会按照保留下来的字母位置进行分割:
* 先输出所有奇数位置上的字母;
* 再输出所有偶数位置上的字母。
这里的位置从 111 开始编号。
题解思路
读入字符串 sss, 首先需要将所有的字母字符全部都提取出来。可以定义一个空串 ttt, 并且遍历整个字符串 sss, 将所有字母字符存入字符串 ttt 中。 本题中可能同时存在大写字母和小写字母, 因此判断当前字符 s[i]s[i]s[i] 为字母的条件为 s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <='Z'。
最后先输出所有奇数位的字符, 再输出所有偶数位的字符。
参考代码
T4 皓仔的藏宝地图
题目大意
给定一个 n×nn \times nn×n 的方格,每个格子中都有一个字符。字符可能是大写英文字母,也可能是数字字符。
地图上的每一种大写字母都代表一种宝物,不同字母对应的宝物分值不同。数字字符只是普通标记,没有任何分值。
现在给出 262626 个整数,分别表示字母 A 到 Z 的分值。
请你计算整张地图中所有字母对应分值的总和。
题解思路
本题首先使用一个字符数组存下来完整的地图,而后输入每一个大写字母对应的分值,存储在数组 vvv 中,对应下标从 111 到 262626。
对于一个大写字母变量 ccc 来说,从字符变量到数字 1∼261 \sim 261∼26 的转化可以直接写 c - 'A' + 1。
最后遍历整个二维数组,每当遍历到一个大写字母时候, 让总答案 ansansans 加上当前字母的分值,最后输出即可,需要注意答案需要使用 long longlong \ longlong long。
参考代码
T5 皓仔的移动距离
题目大意
皓仔站在一个 n×nn \times nn×n 的方形地图上。
地图的左上角坐标为 (1,1)(1,1)(1,1),右下角坐标为 (n,n)(n,n)(n,n)。皓仔一开始站在 (1,1)(1,1)(1,1)。
接下来皓仔会进行 mmm 次移动。每次移动会给出 444 个整数 u,d,l,ru,d,l,ru,d,l,r,分别表示:
* 向上移动 uuu 格
* 向下移动 ddd 格
* 向左移动 lll 格
* 向右移动 rrr 格
如果这次移动后的落点仍然在地图范围内,那么这次移动有效,皓仔会移动到新的位置。
如果这次移动后的落点在地图外,那么这次移动取消,皓仔的位置保持不变。
请你计算所有有效移动里,每次移动出发点到终点的直线距离的总和。
题解思路
模拟练习题,定义两个变量 x,yx, yx,y 来记录皓仔当前的坐标, 初始的坐标为 (1,1)(1, 1)(1,1)。
每次输入 u,l,d,ru, l, d, ru,l,d,r 之后, 则下一步的坐标 (xx,yy)(xx, yy)(xx,yy) 为 (x−u+d,y−l+r)(x - u + d, y - l + r)(x−u+d,y−l+r)。如果下一步的坐标还在地图内, 也就是 xx >= 1 && xx <= n && yy >= 1 && yy <= n,那么就可以往该坐标移动,并且将本次移动的距离计入在内。
对于平面上的两个点 (x1,y1),(x2,y2)(x_1,y_1),(x_2,y_2)(x1 ,y1 ),(x2 ,y2 ),则这两个点之间的距离 dis=(x2−x1)2+(y2−y1)2dis=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}dis=(x2 −x1 )2+(y2 −y1 )2 。
参考代码
T6 皓仔的好数统计
题目大意
定义一个整数是“好数”,当且仅当这个整数的十进制表示中,数字 000 到 999 每一种数字出现的次数都不超过 222 次。
例如:
* 123123123 是好数,因为每种数字都只出现了 111 次;
* 100210021002 是好数,因为数字 000 出现了 222 次,其他数字出现次数都不超过 222 次;
* 111111111 不是好数,因为数字 111 出现了 333 次。
现在给定两个整数 l,rl,rl,r,请你统计从 lll 到 rrr 之间一共有多少个好数。
题解思路
判定一个数字是否是一个好数字,可以先做一下数位分解,对于分解出的每一个数字,在桶数组中记录每个数字出现的个数。
然后遍历整个桶数组,但凡一个数字出现两次以上,那么该数字就不是一个好数字。
从 lll 开始遍历到 rrr 结束,对于每个数字进行判定,统计好数的总数,最后输出即可。
参考代码