1 条题解
-
0
C. 左右房屋 详细题解
题目核心理解
村庄里有 栋房屋,用一串仅含 的字符串表示居民意愿:
- :第 户想住在道路左侧
- :第 户想住在道路右侧
道路可以建在第 栋房屋之后( 可取 到 ):
- 左边: 号房屋
- 右边: 号房屋
修路要求:
- 左侧房屋中,想要住左边()的数量 ≥ 想要住右边()的数量
- 右侧房屋中,想要住右边()的数量 ≥ 想要住左边()的数量
在所有满足条件的 中,选出最靠近 的位置; 若距离相同,选更小的 。
核心思路
1. 关键转化
原题要求“每边至少一半人满意”,向上取整后等价于:
- 左侧: 的个数 的个数
- 右侧: 的个数 的个数
2. 快速统计
使用前缀和数组预处理 的数量,实现 查询任意区间:
- 前 个里 的数量:
- 前 个里 的数量:
- 右侧 里 的数量:
3. 最优位置判断
为避免浮点数精度问题,用 代替 比较距离,结果完全等价。
- 该值越小,说明 越靠近中间
- 若值相同,保留较小的
算法流程
- 预处理前缀和数组 ,记录前 位中 的个数。
- 枚举所有可能的修路位置 。
- 对每个 统计左侧 、左侧 、右侧 、右侧 。
- 判断是否满足:左侧 且 右侧 。
- 在合法位置中,选出 最小的 ;并列时选更小的 。
- 输出最优的 。
公式与复杂度分析
合法性条件:
$$(\text{pre}[n] - \text{pre}[i])\;\ge\;(n-i-(\text{pre}[n]-\text{pre}[i])) $$最优比较指标:
复杂度
- 预处理前缀和:
- 枚举所有位置: 总时间复杂度:。
可轻松处理 、多组数据总长度不超过 的范围。
- 1
信息
- ID
- 6530
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者