官方题解 | 欢乐赛#70题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
题目编号 题目名称 题目难度 T1 皓仔的1000米成绩 入门 T2 皓仔的自习室座位 入门 T3 皓仔的温度记录 入门 T4 皓仔的皇后棋盘 入门 T5 皓仔的双重回文数 普及- T6 皓仔的奖品发放 普及-
T1 皓仔的1000米成绩
题目大意
已知皓仔跑完全程一共用了 nnn 秒,请你帮他计算:这个成绩具体是多少分钟多少秒。
题解思路
111 分钟为 606060 秒,因此将可以将成绩转化为 x/60x / 60x/60 分, x%60x \% 60x%60 秒。
在输入数字 nnn 之后,直接输出 x/60x / 60x/60 以及 x%60x \% 60x%60 即可。
参考代码
T2 皓仔的地理课
题目大意
图书馆门口的电子屏会根据当前情况,给出不同的座位安排建议。
已知以下三个信息:
* aaa 表示当前剩余空位数量;
* bbb 表示是否临近闭馆,b=1b=1b=1 表示临近闭馆,b=0b=0b=0 表示还未临近闭馆。
电子屏会按照下面的规则依次判断:
* 如果临近闭馆,则输出 Go Home
* 否则,如果当前没有空位,则输出 No Seat
* 否则,如果当前有空位并且空位数量不少于 101010,则输出 Quiet Area
* 否则,如果当前有空位并且空位数量少于 101010,输出 Normal Area
根据输入的信息,输出电子屏给的安排结果。
题解思路
分支嵌套练习题:
当 b=1b = 1b=1 时, 临近闭关,输出 Go Home;
否则根据空位数量 aaa 做出判断:
* a==0a == 0a==0 时候没有座位,则输出 No Seat
* 否则如果 a>=10a >= 10a>=10,则输出 Quiet Area
* 否则输出 Normal Area
参考代码
T3 皓仔的温度记录
题目大意
给出连续 nnn 天的温度,如果一段连续 444 天的温度记录中,最大值与最小值的差小于 xxx,那么皓仔就认为这 444 天的温度是“稳定”的。
求一共有多少段连续 444 天的温度记录满足这个条件。
题解思路
使用一维数组输入整个温度表之后,对数组进行遍历。
我们需要考虑 444 天的温度记录, 因此可以从 1∼n−31 \sim n-31∼n−3 进行枚举。
每次对于从 a[i]∼a[i+3]a[i] \sim a[i + 3]a[i]∼a[i+3] 共计四个数字求出的最大值 mamama 以及最小值 mimimi, 如果最大值和最小值的差值 ma−mima - mima−mi 小于 xxx, 则答案加一。
最终输出答案即可。
参考代码
T4 皓仔的皇后棋盘
题目大意
给定一个一个 n×nn \times nn×n 的棋盘,棋盘上存在一些皇后棋子,皇后可以攻击到与自己在同一行、同一列,以及同一条对角线上的所有位置。
现在棋盘上已经放好了若干个皇后。皓仔想知道,哪些位置会被这些皇后攻击到。
输出一个 n×nn \times nn×n 的网格:
* 如果某个位置上有皇后,输出 Q
* 如果某个位置虽然没有皇后,但能被至少一个皇后攻击到,输出 #
* 如果某个位置既没有皇后,也不会被任何皇后攻击到,输出 .
题解思路
对于每一个出现的皇后,首先令皇后所在位置的棋子标记 Q, 对于皇后可以攻击的八个方向进行循环遍历,将范围内不是皇后棋子的点标记为 #。
可以考虑使用方向数组简化代码,使用长度为 888 的八联通方向数组存储往八个方向移动会产生的坐标变化。
枚举 888 个方向, 从当前皇后位置出发,一路走到地图边缘,将所有的点标记为 #。假定当前的方向是 iii, 坐标为 (xx,yy)(xx, yy)(xx,yy), 那么每行走一步则令 xx += dx[i], yy += dy[i]。
对于当前的坐标 (xx,yy)(xx, yy)(xx,yy), 可以通过 xx >= 1 && xx <= n && yy >= 1 && yy <= n
来判定是否还在地图范围内。
最终输出整个二维矩阵即可。
参考代码
T5 皓仔的双重回文数
题目大意
如果一个整数在 xxx 进制表示下是回文数,并且在 yyy 进制表示下也是回文数,那么皓仔就称这个数为“双重回文数”。
请你帮皓仔统计,在 111 到 nnn 这些整数中,一共有多少个数是“双重回文数”。
题解思路
注意到本题需要在两种进制下判定转化之后是否是回文数,因此为了简化代码,可以考虑将判定回文的操作封装成自定义函数。
我们设定check(int x, int y) 函数,用来判定在 yyy 进制下, 数字 xxx 是否是一个回文数。
进制转换直接使用模板, 每次除以 yyy 直到数字 xxx 归零, 将余数存在数组中。回文数的要求是对称出现的数字需要相同,因此我们遍历左半边的所有数字 a[i],判定是否和右半边对称的数字 a[idx + 1 - i] 相同, 是的话则该数字通过了回文数的判定。
本题需要同时满足在 xxx 和 yyy 进制下都是回文数,因此可以从 111 到 nnn 遍历,对于循环变量 iii 判定 check(i, x) 和 check(i, y) 是否同时为真,是的话则答案加一,最后输出答案即可。
参考代码
T6 皓仔的奖品发放
题目大意
一共有 nnn 名员工和 mmm 个奖品。
第 iii 名员工都有一个业绩值,业绩值越高,越早进行奖品选择。如果两名员工的业绩值相同,则编号更小的员工先选。
每个奖品都有一个价值,并且每个奖品只能被选择一次。
同时,每名员工对奖品也有自己的要求。第 iii 名员工只会选择价值在自己预期范围内的奖品,也就是说,他只会选择价值满足 li≤v≤ril_i \le v \le r_ili ≤v≤ri 的奖品。
当轮到某名员工选择时:
* 如果当前还有符合他预期范围的奖品,那么他会从中选择价值最高的那个奖品;
* 如果当前没有任何符合条件的奖品,那么他就不选择奖品。
请你输出最终每名员工选择到的奖品价值。如果没有选到奖品,则输出 000。
题解思路
本题中每个员工有业绩和编号两个信息,因此在给员工进行排名决定奖品选择顺序的时候,需要使用结构体排序,编写cmp函数时候注意先比较业绩再比较编号.
本题数据范围较小, 对于每一个当前需要选择奖品的员工, 可以直接遍历访问所有的奖品,
当出现第一个价值在 l[id]l[id]l[id] 和 r[id]r[id]r[id] 之间的奖品时候,选择该奖品, 并且将该奖品的价值修改成 −1-1−1, 代表已经被选择过了。而如果没有找到合适的奖品,则直接输出 000 即可。
参考代码