2019 csp-s 解析及代码

本文详细解析了2019 CSP-S竞赛中的三道题目:1. 格雷码问题,通过观察规律,发现对于n位的格雷码,可以通过特定的性质枚举解决;2. 括号树问题,使用动态规划求解树上每个节点的括号字符串中不同合法括号串的个数;3. 树上的数问题,通过贪心策略和链状结构解决节点数值交换后的最小字典序排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2019 csp-s 解析及代码

T1 格雷码

题目大意

格雷码是一种特殊的 nnn 位二进制串表示方法,它要求相邻的两个二进制串之间恰好有一位不同,特别地,第一个串和最后一个串也算相邻。
现在给定一个 nnn 和一个 kkk ,要求你输出 nnn 位格雷码中的第 kkk 个。注意,所有格雷码的编号从 000 开始。

输入格式

一行两个正整数 nnnkkk ,含义如题中描述。

数据范围

对于所有测试数据, 1≤n≤641 \le n \le 641n640≤k≤2n0 \le k \le 2^{n}0k2n

思路

我们先将 333 位和 444 为格雷码依次列出来,如下图:
333 位:

码 | 序号
000| 0
001| 1
011| 2
010| 3
110| 4
111| 5
101| 6
100| 7

444 位:

码 | 序号
0000 | 0
0001 | 1
0011 | 2
0010 | 3
0110 | 4
0111 | 5
0101 | 6
0100 | 7
1000 | 8
1001 | 9
1011 | 10
1010 | 11
1110 | 12
1111 | 13
1101 | 14
1100 | 15

通过观察可以发现,对于 nnn 位的格雷码,除了第 nnn 位,其他位上都满足这样一个性质:

在第 iii 位上的区间 [2i−1,2n−2i−1−1][2^{i - 1}, 2^{n} - 2^{i - 1} - 1][2i1,2n2i11] 上,数字 000111 以连续的 2i2^{i}2i 个重复出现。 例如 444 位格雷码的第 222 位上:

0 | 0
0 | 1
1 | 22−1=22^{2 - 1} = 2221=2
1 | 3
1 | 4
1 | 5
0 | 6
0 | 7
0 | 8
0 | 9
1 | 10
1 | 11
1 | 12
1 | 24−22−1−1=132^{4} - 2^{2 - 1} - 1 = 13242211=13
0 | 14
0 | 15

同时我们可以发现,在除了上述区间以外的区域,所有位数上都是 000 。(包括第 nnn 位)

而对于第 nnn 位,显然区间 [0,2n−1−1][0, 2^{n - 1} - 1][0,2n11] 上都是 000 ,区间 [2n−1,2n−1][2^{n - 1}, 2^{n} - 1][2n1,2n1] 上都是 111

所以我们只需要枚举一遍 nnn 位即可。

**注意:**当 n=64n = 64n=

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值