1 条题解
-
0
题意理解
给定长度为 ( 2n+1 ) 的 01 串,需要在相邻数字之间插入 ( n ) 个?和 ( n ) 个:(以及括号),构成合法的三目运算符表达式,使其值为 1。
三目运算符为右结合,构造时数字顺序必须与原串一致。关键观察
- 表达式值为 1 的必要条件:最后一个数字必须为 1(因为最终返回值要么是
?前的分支,要么是:后的分支,而最后一个数字是表达式的最右操作数)。 - 若最后一个数字为 0,则一定无解(除非通过括号改变求值顺序,但右结合性决定了最终操作数固定)。
- 构造策略:利用
a?b:c的特性,当 a=1 时结果为 b,当 a=0 时结果为 c。通过递归/分段构造,确保最终返回 1。
算法流程
情况 1:最后一个数字为 0
直接输出"No"。情况 2:最后一个数字为 1
- 若整个串已经是
"1",直接输出"1"。 - 否则,根据前几个字符的模式,递归构造:
设函数
solve(s)处理以 1 结尾的串:- 模式 A(首字符为 '0'):
构造形如0?(...):1的表达式,其中(...)部分递归处理去掉首尾的中间部分。 - 模式 B(首字符为 '1',次字符为 '0'):
构造形如(1?0:x)?(...):1,其中x是第三个字符,(...)递归处理剩余部分。 - 模式 C(首字符为 '1',次字符为 '1'):
构造形如1?1:(...),其中(...)递归处理去掉前两个字符的剩余部分。
情况 3:最后一个数字为 1,但需要特殊处理
当串中有多个 '1' 时,可尝试选择中间的某个 '1' 作为分割点,构造形如(前段)?(中段):(后段)的表达式,使得整体为 1。
具体策略:从右向左扫描,寻找满足以下条件的 '1' 的位置i:i到末尾的距离为奇数(保证可分割为合法表达式段)。- 将串分为
[0,i]、[i+1,pre]、[pre+2, end]三段,分别递归构造,使得整体表达式为 1。
构造细节
- 递归构造时,每层添加括号保持结合顺序。
- 每处理两个字符(一个数字和一个运算符),减少问题规模。
- 保证最终表达式长度在 ( O(n) ) 内。
无解判断
- 最后一个字符为 0 → 无解。
- 尝试所有可能的分割点后仍无法构造 → 无解。
复杂度分析
- 扫描与递归构造:每个字符至多处理一次,( O(n) )。
- 表达式长度:每个数字对应常数个字符,总长度 ( O(n) )。
算法标签
- 递归构造
- 三目运算符表达式解析
- 分治与贪心
- 字符串处理
样例验证
样例 1:"10101",最后一个字符为 1,按模式 C 构造,得到(1?0:1)?0:1,值为 1。
样例 2:"00000",最后一个字符为 0,无解。总结
本质是利用三目运算符的短路特性,通过递归分治构造,确保最终返回 1。关键在于正确处理以 1 结尾的串,并利用串中的 1 作为控制点引导求值路径。 - 表达式值为 1 的必要条件:最后一个数字必须为 1(因为最终返回值要么是
- 1
信息
- ID
- 5764
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者