语法组月赛视频讲解

点击查看讲解视频


T1: 马拉松

顺序结构

求出分钟是 n/60n/60 ,秒数是 n%60n\%60


T2: 点外卖

选择结构

根据题目中的条件分别判断两个APP是否到达了优惠券的使用条件,如果到达了使用条件,更新花费价格的最小值即可


T3: 弹力球

for循环

对于 30%30\% 的数据,小球不会反弹,那么我们用一个变量记录小球的位置,直接按顺序模拟即可。

对于 100%100\% 的数据,我们注意到题目中的 dnd \le n ,也就是小球碰到边界后的反弹至多一次,所以可以直接算出小球反弹后的位置,进行快速计算。


T4: 纯偶数

数位分离

题目要求我们从最低位开始移除数字,那么等于删除掉数字的最后一位,可以联想到用数位分离进行处理。

我们的目标是使得数位中不出现奇数,所以我们可以用第一次数位分离先算出数字中奇数的数量,第二次数位分离去统计需要操作的次数,当奇数位还存在的时候执行数位分离。


T5: 密码学

字符串,模拟

题目要求我们模拟加密和解密的两个过程,加密我们可以用一个数组记录每个字母被转化为了哪一个,然后再进行循环位移的操作,对于 k100k \le 100 的情况,可以直接进行模拟。

我们发现循环位移的操作是有规律的,循环每 2626 次后的字母都是相同的,所以我们可以把 k%26k\%26 再进行计算。

对于解密操作,可以把加密的操作倒过来做,原来是先变换字母,向后循环位移,那么我们改成先向前循环位移,后变化字母,所以我们需要记录每个字母是由哪个字母转化过来的,具体的实现参考代码。


T6: 倍增数

  • 对于 30%30\% 的数据,可以直接枚举 [1,n][1,n] 的每一个数字,然后检查是否为倍增数即可。

  • 对于 80%80\% 的数据, 我们注意到倍增数的右边是左边数位的 22 倍,那么如果我们知道了左半边的数字,其实右半边的数字也可以确定下来了,所以我们只枚举倍增数的左边,然后就可以得到倍增数的右边,再合并计算出数字的大小,如果数字在 [1,n][1,n] 的范围中,那么就可以计入答案,此处使用字符串处理起来会相对好写一些。

  • 对于 100%100\% 的数据, 我们需要观察倍增数的性质,如果数字的位数 lenlen 是奇数,例如 1234512345 ,那么左半边最大可以取到 9999 ,答案为 10len2110^{\large \lfloor \frac{len}{2}\rfloor} -1 ,对于 lenlen 是偶数的情况,我们发现 lenlen 位的倍增数有限制,我们可以先计算位数小于 lenlen 的倍增数,有 $\ 10^{\large \lfloor \frac{\large len}{2}\rfloor-1} -1$ 个。然后倍增数的大小是有单调性的,会单调递增,如果我们的左部分能够选 1212 ,那么 [1,11][1,11] 肯定可以选到,例如我们有 123456123456 ,那么左半边肯定可以选取 [100,122][100,122] ,对于 123123 左半边是否可以选择,我们可以单独检查,即构造出对应的右半边,此处推荐使用字符串来写,并且字符串的长度一样,可以利用字典序比大小。

0 条评论

目前还没有评论...