官方题解 | 欢乐赛#77题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
题目编号 题目名称 题目难度 T1 皓仔看时间 入门 T2 皓仔的铁人三项 入门 T3 皓仔找元音 入门 T4 皓仔截取数字 入门 T5 皓仔的进制回文数 普及- T6 皓仔的队伍排序 普及-
T1 皓仔看时间
题意简述
给定当前时间的小时 h 和分钟 m。
要求按照 hh:mm 的格式输出时间。
如果小时或分钟不足 222 位,需要在前面补 000。
解题思路
这是一道格式化输出题。
小时和分钟都要固定输出 222 位,可以使用 printf 的格式控制:
%02d 表示输出一个整数,并且宽度为 222 位,不足 222 位时在前面补 000。
所以直接输出:
即可。
时间复杂度为 O(1)O(1)O(1)。
参考代码
T2 皓仔的铁人三项
题意简述
给定皓仔在铁人三项中三个项目的排名 a、b、c。
如果满足下面任意一个条件,就可以获奖:
三个项目都排在前 555 名;
至少有一个项目排在前 222 名。
如果可以获奖,输出 Award,否则输出 No Award。
解题思路
直接按照题意进行条件判断。
第一种获奖情况:
第二种获奖情况:
只要两个条件中有一个成立,就输出 Award。
否则输出 No Award。
时间复杂度为 O(1)O(1)O(1)。
参考代码
T3 皓仔找元音
题意简述
给定一个只包含小写英文字母的字符串 s。
需要找出其中所有元音字母,并按照它们在原字符串中出现的顺序输出。
元音字母包括:
如果字符串中没有任何元音字母,则输出 -1。
解题思路
从前往后遍历字符串 s。
如果当前字符是 a、e、i、o、u 中的一个,就输出这个字符,并记录已经找到过元音字母。
遍历结束后,如果没有找到任何元音字母,就输出 -1。
时间复杂度为 O(∣s∣)O(|s|)O(∣s∣)。
参考代码
T4 皓仔截取数字
题意简述
给定 nnn 次询问。
每次给出一个数字 x 和一个整数 m,要求输出数字 x 最右侧长度为 m 的部分。
注意截取结果中的前导零需要保留。
解题思路
因为题目要求保留截取结果中的前导零,所以适合把数字 x 当作字符串读入。
对于字符串 s,如果它的长度为 len,那么最右侧长度为 m 的部分就是从下标 len - m 开始一直到末尾的字符。
直接循环输出这一段即可。
时间复杂度为 O(n×∣x∣)O(n \times |x|)O(n×∣x∣)。
参考代码
T5 皓仔的进制回文数
题意简述
给定三个整数 l、r、x。
要求统计区间 [l,r][l,r][l,r] 中有多少个整数,在转换成 x 进制后是回文数。
回文数指转换后的表示从左往右读和从右往左读完全相同。
解题思路
因为 r≤106r \le 10^6r≤106,可以直接枚举区间 [l,r][l,r][l,r] 中的每一个整数。
对于每个数:
先把它转换成 x 进制;
然后判断转换后的结果是否为回文串。
进制转换时,可以不断对 x 取余:
n % x 得到当前最低位;
n /= x 去掉最低位。
因为判断回文时只需要比较两端是否相同,所以可以把每一位存入数组,然后用双指针判断。
时间复杂度为 O((r−l+1)logr)O((r-l+1)\log r)O((r−l+1)logr)。
参考代码
T6 皓仔的队伍排序
题意简述
给定 nnn 名学生的信息,包括出生年月日、身高和姓名。
需要按照下面规则排序:
首先身高更高的排在前面;
如果身高相同,则年龄更大的排在前面,也就是出生日期更早的排在前面。
最后按排序后的顺序输出每名学生的姓名。
解题思路
用结构体数组保存每名学生的信息。
排序时按照题目规则写比较函数:
如果两名学生身高不同,则身高高的排在前面;
如果身高相同,则比较出生日期,出生年份更小的年龄更大;
如果年份相同,再比较月份;
如果月份相同,再比较日期。
题目保证不会有两名学生在同一天出生,所以不需要继续比较姓名。
时间复杂度为 O(nlogn)O(n\log n)O(nlogn)。
参考代码