- gf24240 的博客
《梦溪笔谈·C++》卷三十八:抗击“桦加沙”台风
- @ 2025-9-23 18:17:49
前言
D老师真是和我们一样闲着没事干。
先上张大表:
| 题目 | 等级 | ||
|---|---|---|---|
| A | 语法基础 | ||
| B | |||
| C | CSP-J | ||
| D | |||
| E | CSP-S | ||
| F | |||
| G | |||
好像没啥用。
A.台风监测系统1
直接枚举就好了,或者有什么特殊的公式。反正只有 ~ 。
枚举每一个 ,判断 是否等于 。
伪代码:
input(n)
for i in (1, 9):
if i * 10 + i + i == n:
print(i)
end
print(404)
B.D老师的网课点名
根据题意,很容易看出这是递归(没学的赶紧去补课吧,这里不讲了。)。
所有递归就两个内容:
- 边界;
- 递归式。
比递推少了两步!
- 把上一位同学传过来的数字加上自己的编号,得到数值
- 如果这个时候数字 的个位是 ,那么就结束互动。否则假设当前同学的编号为 ,则按下面的规则传递给下一位小朋友:
- 如果 是奇数,那么传递给编号为 的小朋友。
- 如果 是偶数,那么传递给编号为 的小朋友。
就根据这些,很容易就能写出递归函数。
伪代码:
def dg(t, num):
N = t + num
if N % 10 == 3:
end
if t % 2 == 1:
dg(3 * t + 1, N)
else
dg(t / 2, N)
C.台风监测系统2
既然数据这么小,直接枚举就好了。枚举每一个点的 和 ,再计算可以检测到多少个建筑物。
for x in (1, n):
for y in (1, m):
cnt = 0
for {xi, yi} in 建筑物:
if mhd(x, y, xi, yi) <= 2:
cnt += 1
ans = max(ans, cnt)
print(ans)
(差点就写成 python 了)
D.台风监测系统2.0beta版测试数列1
这个标题是跟道法老师学的。
直接模拟就好了。很容易想到 vector ()。要注意的是 vector 的下标是从 开始的。而题意是从 开始。有两种解决方案:
- 每个下标都减一;
- 在输入数组前
push_back一个东西。
E.台风监测系统2.0beta版测试数列2
首先看数据范围: 。就知道两重循环是不行的。
看到这种大段长度修改的就想到差分()。但是这又不同于普通的差分,因为这题对奇数和偶数有不同的操作。
- 如果 至 区间某个 值是奇数,则 值增加 。
- 如果 至 区间某个 值是偶数,则 值保持不变。
仔细想想就会发现:奇数每次只加一,而加一之后又会变成偶数。所以每一个数字最多只会被操作一次。 所以可以定义一个数组存储数字是否被修改。后面再用前缀和复原,就可以做出来了。
额……然后后面我就不会了。
()