语法周赛round27
T1¶
题意分析
给定一个两位数 $a$ 和一个目标个位数字 $b$,允许对 $a$ 加上一个非负整数 $x$,使得:
的个位数字等于 $b$,并且 $x$ 尽可能小。
例如:当 $a=13,b=5$,则 $x=8$。
解题思路
分类讨论处理:
首先令 $t=a\bmod 10$,其中 $\bmod$ 表示取余。即 $t$ 是 $a$ 的个位数字。
- 当 $t\leq b$ 时,$x=b-t$。
- 当 $t>b$ 时,$x=b+10-t$。
T2¶
解题思路
题目给出的座位顺序为:
可以发现:
- 所有 奇数座位 按从大到小排列
- 然后所有 偶数座位 按从小到大排列
因此,整个序列可以看作由两部分组成:
- 奇数部分:$99,97,\ldots,1$,共 $50$ 个
- 偶数部分:$0,2,4,\ldots,98$,共 $50$ 个
因此可以使用分类讨论的思想完成本题:
情况一:$a,b$ 均为奇数
说明此时 $a,b$ 处于左半部分,但注意题目并没有规定 $a,b$ 的相对位置,因此无法确定 $a$ 在 $b$ 的左边还是右边。
观察规律:$99$ 是第 $50$ 个奇数,$1$ 是第 $1$ 个奇数。因此
$a$ 是第 $\lfloor\dfrac{a}{2}\rfloor +1$ 个奇数,$b$ 是第 $\lfloor\dfrac{b}{2}\rfloor +1$ 个奇数。
因此答案为:$|(\lfloor\dfrac{a}{2}\rfloor +1)-(\lfloor\dfrac{b}{2}\rfloor +1)|-1$。
情况二:$a,b$ 均为偶数
说明此时 $a,b$ 处于右半部分,思路同奇数。
因此答案为:$|(\lfloor\dfrac{a}{2}\rfloor+1)-(\lfloor\dfrac{b}{2}\rfloor +1)|-1$。
情况三:$a,b$ 奇偶性不同
不难证明答案为:$(\lfloor\dfrac{a}{2}\rfloor+1)+(\lfloor\dfrac{b}{2}\rfloor+1)-2=\lfloor\dfrac{a}{2}\rfloor+\lfloor\dfrac{b}{2}\rfloor$
实现步骤
使用 if - else 语句完成分类讨论:
- 当
a % 2 == b % 2时,按照情况一和情况二处理。求绝对值可以使用abs函数,求向下取整直接使用/即可。 - 否则说明奇偶性不同,按照情况三处理即可。
T3¶
解题思路
设第 $i$ 次开门使用的密码为 $x_i$。
根据题意:
- 第一次开门使用的密码为初始密码:
$$ x_1 = x_1 $$
- 每次开门 之后,密码都会更新为:
$$ x_{i+1} = (x_i^2 + C) \bmod 10000 $$
题目要求的是 第 $k$ 次开门时使用的密码 $x_k$。
这是一个典型的递推循环过程:
- 已知 $x_1$
- 通过固定公式反复更新密码
- 每次更新只与上一次的密码有关
因此,可以直接按照定义模拟这个过程。
注意:
- 第一次开门不需要进行任何计算
- 从第二次开门开始,才会进行密码更新
从 $i=1$ 开始:
- 当 $i=1$ 时,当前密码为 $x_1$
- 对于 $i \ge 2$,重复执行:
$$ x_i = (x_{i-1}^2 + C) \bmod 10000 $$
连续更新 $k-1$ 次后,即可得到第 $k$ 次开门的密码。
- 读入 $x_1,C,k$
- 设当前密码 $x=x_1$
- 重复执行 $k-1$ 次:
- 更新 $x=(x^2+C)\bmod 10000$
- 输出 $x$
使用 for 循环即可实现。
T4¶
队伍中共有 $n$ 个人,按原顺序依次为:
其中 $t_i$ 表示第 $i$ 个人的航班还有多少分钟起飞。
机场的调整规则是:
- 所有满足 $t_i \le 15$ 的人,需要被移动到队伍最前面
- 这些人之间的相对顺序不变
- 其余 $t_i > 15$ 的人排在后面,相对顺序同样不变
这本质上是一个稳定分类问题。
核心思路
可以将队伍分成两类人:
- 优先人群:$t_i \le 15$
- 普通人群:$t_i > 15$
只要:
- 按原顺序扫描队伍
- 分别收集这两类人
- 最后将“优先人群”接在“普通人群”前面即可
这样能够保证相对顺序不被破坏。
构造方式
设两个序列:
- $A$:存放所有满足 $t_i \le 15$ 的人,按出现顺序加入
- $B$:存放所有满足 $t_i > 15$ 的人,按出现顺序加入
最终队伍为:
算法步骤
- 定义数组
int a[10005], b[10005]存储优先人群和普通人群。 - 创建两个变量
int tot1 = 0, tot2 = 0,分别记录优先人群和普通人群的个数。 - 读入 $n$ 个人的排队时间 $t$:
- 当 $t\leq 15$,更新
a[++tot1] = t。 - 否则,更新
b[++tot2] = t。
- 当 $t\leq 15$,更新
- 遍历 $a$ 数组,输出 $a[1]\sim a[tot1]$。
- 遍历 $b$ 数组,输出 $b[1]\sim b[tot2]$。
T5¶
整体结构分析
题目中的右箭头由两部分组成:
- 右侧等腰三角形
- 左侧横杠矩形
并且整个图形满足:
- 上下对称
- 等腰三角形的上半部分第 $i$ 行占据 $i$ 个格子
- 总行数为 $n$,总列数为 $m$
- 横杠高度为 $k$
由于 $n$ 为奇数,可以确定箭头的中轴行为:
右侧三角形的形态
以中轴行为分界:
- 在第 $mid$ 行,三角形达到最大宽度
- 向上、向下每远离中轴一行,占据的格子数减少 $1$
设当前行为 $i$,则该行在三角形部分占据的格子数为:
这些格子始终右对齐,即从第 $m-len$ 列到第 $m-1$ 列填充 #。
横杠矩形的范围
横杠位于图形的中间,共占据 $k$ 行:
- 起始行:
$$ L = mid - \frac{k-1}{2} $$
- 结束行:
$$ R = mid + \frac{k-1}{2} $$
在这些行中,横杠会向左延伸,填满从第 $0$ 列到第 $m-1$ 列中不属于三角形的部分。
也可以理解为:
在横杠所在的行,三角形左侧的所有位置全部填充 #。
每一行的填充规则
对每一行 $i$:
- 先计算该行三角形应占据的格子数 $len$
- 默认该行只有右侧三角形部分填充
# -
若当前行满足 $L \le i \le R$,则:
-
将该行中三角形左侧的所有格子也填充为
# - 其余位置填充
.
算法步骤
- 读入 $n,m,k$
- 计算中轴行 $mid=\dfrac{n-1}{2}$
- 计算横杠的起止行 $L,R$
-
对每一行 $i=0$ 到 $n-1$:
-
计算 $len=\dfrac{n+1}{2}-|i-mid|$
- 初始化整行为
. - 将区间 $[m-len,m-1]$ 置为
# - 若 $L \le i \le R$,将区间 $[0,m-len-1]$ 置为
# - 按行输出结果