官方题解 | 欢乐赛#71题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
题目编号 题目名称 题目难度 T1 皓仔的逆序输出 入门 T2 皓仔的期末评奖 入门 T3 皓仔的字符串展开 入门 T4 皓仔的矩阵匹配 入门 T5 皓仔的幸运三元组 入门 T6 皓仔的质数数位和 普及-
T1 皓仔的逆序输出
题目大意
输入了 444 个整数,把这 444 个整数按照相反的顺序输出出来。
题解思路
定义 444 个整数变量 a,b,c,da, b, c, da,b,c,d, 按顺序输入之后, 逆序输出 a,b,c,da,b,c,da,b,c,d ,使用空格隔开即可。
参考代码
T2 皓仔的期末评奖
题目大意
期末考试有三门科目,分别是语文、数学、英语。现在输入这三门课的成绩,请你根据下面的规则判断最终获得的奖项:
* 如果语文、数学、英语三门成绩都大于等于 909090 分,则获得一等奖。
* 如果没有获得一等奖,则再根据三门总分评奖:
* 总分大于等于 270270270 分,获得二等奖;
* 否则,如果总分大于等于 240240240 分,获得三等奖;
* 否则,如果总分大于等于 180180180 分,获得优秀奖;
* 否则,输出未获奖。
请你编写程序,输出最终获得的奖项。
题解思路
分支嵌套练习题: 首先定义 a,b,ca, b, ca,b,c 三个变量输入语数英三科成绩,
当三科成绩都大于等于 909090 也就是 a >= 90 && b >= 90 && c >= 90 时, 输出 一等奖;
否则根据总分 d=a+b+cd = a + b + cd=a+b+c 做出判断:
* d>=270d >= 270d>=270 时候,输出 二等奖
* 否则如果 d>=240d >= 240d>=240 ,输出 三等奖
* 否则如果 d>=180d >= 180d>=180 ,输出 优秀奖
* 否则输出 优秀奖
参考代码
T3 皓仔的字符串展开
题目大意
给定一种经过压缩的的字符串,这个字符串一定由“大写字母”和“数字字符”交替组成。
其中,每一个数字字符都表示它前面那个大写字母需要重复输出多少次。
例如字符串 A3B2C4 表示:
* A 输出 333 次;
* B 输出 222 次;
* C 输出 444 次;
所以展开后的结果为 AAABBCCCC。
现在请你帮助皓仔输出这个字符串展开后的结果。
题解思路
定义字符串并且输入,每次要展开的内容一定是一个字母字符加上一个数字字符。
因此遍历整个字符串,每两个字符进行一次展开。需要输出的是字母字符 s[i]s[i]s[i], 对应的次数是数字字符 s[i****[i + 1]s[i+1]。
从数字字符转化成对应的数字需要减去 '0' , 因此循环 s[i] - '0' 次输出字符 s[i]s[i]s[i]。
参考代码
T4 皓仔的矩阵匹配
题目大意
给定两个大小相同的 0/10/10/1 矩阵,两个矩阵都有 nnn 行 mmm 列。
现在他想进行一次特殊的字符匹配。对于矩阵中的每一个位置 (i,j)(i,j)(i,j),如果这个位置上的这个位置才算“匹配成功”。
将两个矩阵的匹配程度定义为匹配成功的位置在整个矩阵中的占比,
如果匹配程度大于等于给定的比值 xxx,则输出 YES;否则输出 NO。
请你帮助皓仔判断最终结果。
题解思路
注意题目中给定的数组是没有空格的,输入时候需要使用字符输入。
定义两个字符数组 a,ba, ba,b, 在输入结束之后遍历所有的坐标 (i,j)(i, j)(i,j),如果两个数组在该位置恰好相反, a[i][j] != b[i][j],则匹配成功的个数 cntcntcnt 加一。
匹配程度 ansansans 等于匹配个数除以总字符个数 cnt/n/mcnt / n / mcnt/n/m,根据该数值是否大于等于阈值 xxx 来判定输出 YES 还是 NO。
参考代码
T5 皓仔的幸运三元组
题目大意
给定一个长度为 nnn 的数组,现在想从中选出三个下标互不相同的位置 i,j,ki,j,ki,j,k,并且满足:
* 1≤i<j<k≤n1 \le i < j < k \le n1≤i<j<k≤n
* ai+aj+aka_i+a_j+a_kai +aj +ak 恰好等于给定的整数 xxx
如果一个三元组 (i,j,k)(i,j,k)(i,j,k) 满足上面的条件,那么就称它为一个“幸运三元组”。
请你问一共有多少个幸运三元组。
题解思路
注意到本题中数据范围较小,可以直接暴力枚举所有的三元组 (i,j,k)(i, j, k)(i,j,k),并且判断该三元组是否符合题意。
三重循环嵌套分别枚举 i,j,ki, j ,ki,j,k, 注意题目中的要求是 1≤i<j<k≤n1 \le i < j < k \le n1≤i<j<k≤n, 因此 jjj 的枚举范围是 i+1∼ni + 1\sim ni+1∼n, kkk 的枚举范围是 j+1∼nj +1 \sim nj+1∼n。
最后检查一下是否符合题意, 如果 ai+aj+aka_i+a_j+a_kai +aj +ak 恰好等于给定的整数 xxx, 答案加一,最后输出答案。
参考代码
T6 皓仔的质数数位和
题目大意
如果一个数不断的将自身更改为自身的数位和,直到变成一位数为止,并且在这个过程中出现的每一个数都是质数,那么皓仔这个数为“好数”。
例如:
* 29→11→229 \to 11 \to 229→11→2,过程中每个数都是质数,所以 292929 是好数;
* 89→17→889 \to 17 \to 889→17→8,最后出现了 888,不是质数,所以 898989 不是好数。
* 16→716 \to 716→7, 最开头出现了 161616, 不是质数,所以 161616 不是好数。
现在给定两个整数 lll 和 rrr,请你求出区间 [l,r][l,r][l,r] 中一共有多少个好数。
题解思路
枚举 l∼rl \sim rl∼r 范围内的所有数字,进行是否是好数的判定。
对于每个数字首先定义一个标记 flag = true ,本题中的判定需要一直持续到数字变为一位数才停下,因此可以使用 while(n >= 10) 循环, 在数组成为一位数之前不断地进行质数判断, 只要有一次判断出非质数, 则让 标记 flag = false 。如果在循环结束之后标记仍然为真,则答案加一。最终输出答案即可。
参考代码