2023 滨江区信息学竞赛复赛题解
A
对于正整数 \(x\),定义 \(p(x)\) 表示其所有非 \(0\) 数位上的数的乘积。有一个函数:
\(f(x)=\begin{cases}x,x\le 9\\ f(p(x)),\text{otherwise}\end{cases}\)
给出 \(n\),求 \(f(n)\)。
直觉告诉我们一直进行 \(x\leftarrow p(x)\) 的操作不会进行太多次(不太会证),直接递归即可。
B
打印边长为 \(2^n\) 的三角形,其中边长为 \(2^i\) 的三角形由三个边长为 \(2^{i-1}\) 的三角形拼成,边长为 \(1\) 的三角形为
1。中心用 \(0\) 填充。\(n\le 10\)。
根据三角形的构造方式,设计一个递归函数 solve(x, y, k) 表示打印以 \(x,y\) 为顶点,边长为 \(k\) 的三角形,先调用三次 solve(..., ..., k >> 1) 打印三个小三角形,然后用 \(0\) 填充中心区域。
时间、空间复杂度均为 \(\mathcal{O}(4^n)\)。
C
\(n\) 个人,每个人有姓名(字符串)、学号(整数)、性别(字符)三个属性。每个人除性别外的信息保证不同。
\(m\) 次查询,给出两个参数,为字符串或整数,输出这两参数对应的人性别是否不同。
\(n,m\le 1000\),字符串长度为常数级别。
用 map 建立姓名、学号与性别的映射。读入参数时要都用字符串读,然后再转成整数。最后在 map 里面查询即可。
时间复杂度为 \(\mathcal{O}((n+m)\log n)\),空间复杂度为 \(\mathcal{O}(n)\)。
D
已知 \(1998\) 年 \(1\) 月 \(1\) 日是星期四,求 \(n\) 年有多少个月的 \(13\) 号是星期五。
\(n\ge 1998\)。经实测,\(\boldsymbol{n}\) 不会很大。
先算出 \(n\) 年 \(1\) 月 \(1\) 日是星期几,然后按照月份枚举天。
用一个变量 \(d\),表示这是从 \(1998\) 年 \(1\) 月 \(1\) 日所在星期星期一起的第几天,算出当前日期的 \(d\),是星期五的条件为 \(d\bmod 7=5\)。
时间复杂度为 \(\mathcal{O}(n)\),空间复杂度为 \(\mathcal{O}(1)\)。
E
\(n\) 皇后问题。新增限制:给出一个点 \(x,y\),与这个点八联通以及其本身位置不能放皇后。求方案数。
\(n\le 12\)。
深搜、回溯,枚举每一行的皇后,判断当前列、斜线是否被攻击。
时间复杂度为 \(\mathcal{O}(n!)\),空间复杂度为 \(\mathcal{O}(n^2)\)。
F
输出 \(m\sim n\) 之间的所有质数。
\(m\le n\le 10^7\)。
欧拉筛板子。时间、空间复杂度均为 \(\mathcal{O}(n)\)。
G
平面上有 \(n\) 个关键点,还有一个动点,\(m\) 次操作,每次动点向上、下、左、右移动一步,每次移动后,求该动点到所有关键点的曼哈顿距离之和。
\(n\le 10^5\),\(m\le 3\times 10^5\)。
移动就是给你 \(m\) 个定点做 \(m\) 次询问,套路拆绝对值,然后是二维数点板子。
时间复杂度为 \(\mathcal{O}((n+m)\log(n+m))\),空间复杂度为 \(\mathcal{O}(n+m)\)。
鲜花:线段树被卡空间了,【数据删除】比赛开 \(64\text{MB}\)。但是没顶格造数据,数组开小就过了。笔者会树状数组数点的,只是觉得后缀 BIT 或做神秘映射不太习惯。
H
数轴上有 \(n\) 个点,每个点上有权值 \(f_i\),每个点走到左边的第一个点距离为 \(t_i\),每过 \(1\) 单位时间,每个点权值减少 \(d_i\),直到 \(0\) 为止。
你有 \(12h\) 单位的时间,初始在 \(1\) 号点,你可以在数轴上任意走动,花费两点间距离的耗时;或获取点的权值,耗时为 \(1\)。
\(n\le 25\),\(h\le 16\)。
这里先令 \(h\) 乘上 \(12\)。
考虑 dp。需要有函数:
-
\(\text{calc}(i,j)\) 表示还剩 \(j\) 单位时间,在第 \(i\) 个点,能得到多少权值。
-
\(\text{dis}(i,j)\) 表示 \(i,j\) 两点间的距离。
有转移 \(f_{i,j}=\max\limits_{k=1}^n[f_{k,j-1-\text{dis}(i,k)}+\text{calc}(i,j)]\),其中 \(f_{i,j}=0\,(j\le 0)\)。
记忆化搜索实现。没调出来 /fn。或请求叉。
时间、空间复杂度均为 \(\mathcal{O}(nh)\)。
I
三个骰子,每个骰子等概率出现 \(1\sim s_i\) 的数字,将三个骰子上的数相加,出现概率最大的数是多少?输出最大的那个。
\(s_i\le 10^5\)。
一眼背包。将概率最大转化成相加的方案数最多。设 \(f_{i,j}\) 表示前 \(i\) 个骰子,和为 \(j\) 的方案数,其中 \(f_{0,0}=1\)。
有转移:\(f_{i,j}=\sum\limits_{k=\max\{0,j-s_i-1\}}^{j-1}f_{i-1,k}\),前缀和优化即可,注意边界。
时间、空间复杂度均为 \(\mathcal{O}(s_1+s_2+s_3)\)。
J
数轴上有 \(n\) 个人,每个人有一个火把,一开始第 \(k\) 个人的火把被点燃。一个火把被点燃后只能燃烧 \(t\) 秒。
每个人可以用自己的火把点燃其他人的火把,需要跑到其他人的位置与其重合。
假设每个人的速度相同,请求出一个最小的速度,使得所有人的火把都被点燃过。
\(n\le 10^5\)。
赛时就看了一会,不会 /cf。润了。

浙公网安备 33010602011771号