1 条题解

  • 0
    @ 2026-4-15 18:02:42

    C. 左右房屋 详细题解

    题目核心理解

    村庄里有 nn 栋房屋,用一串仅含 0/10/1 的字符串表示居民意愿:

    • aj=0a_j=0:第 jj 户想住在道路左侧
    • aj=1a_j=1:第 jj 户想住在道路右侧

    道路可以建在ii 栋房屋之后ii 可取 00nn):

    • 左边:1i1\sim i 号房屋
    • 右边:i+1ni+1\sim n 号房屋

    修路要求:

    1. 左侧房屋中,想要住左边(00)的数量 想要住右边(11)的数量
    2. 右侧房屋中,想要住右边(11)的数量 想要住左边(00)的数量

    在所有满足条件的 ii 中,选出最靠近 n2\dfrac{n}{2} 的位置; 若距离相同,选更小的 ii


    核心思路

    1. 关键转化

    原题要求“每边至少一半人满意”,向上取整后等价于:

    • 左侧:00 的个数 \ge 11 的个数
    • 右侧:11 的个数 \ge 00 的个数

    2. 快速统计

    使用前缀和数组预处理 11 的数量,实现 O(1)O(1) 查询任意区间:

    • ii 个里 11 的数量:pre[i]\text{pre}[i]
    • ii 个里 00 的数量:ipre[i]i - \text{pre}[i]
    • 右侧 i+1ni+1\sim n11 的数量:pre[n]pre[i]\text{pre}[n] - \text{pre}[i]

    3. 最优位置判断

    为避免浮点数精度问题,用 n2i|n - 2\cdot i| 代替 n2i|\dfrac{n}{2} - i| 比较距离,结果完全等价。

    • 该值越小,说明 ii 越靠近中间
    • 若值相同,保留较小的 ii

    算法流程

    1. 预处理前缀和数组 pre\text{pre},记录前 ii 位中 11 的个数。
    2. 枚举所有可能的修路位置 i[0,n]i\in[0,n]
    3. 对每个 ii 统计左侧 00、左侧 11、右侧 11、右侧 00
    4. 判断是否满足:左侧 010\ge1 且 右侧 101\ge0
    5. 在合法位置中,选出 n2i|n-2i| 最小的 ii;并列时选更小的 ii
    6. 输出最优的 ii

    公式与复杂度分析

    合法性条件:

    (ipre[i])    pre[i](i - \text{pre}[i])\;\ge\;\text{pre}[i] $$(\text{pre}[n] - \text{pre}[i])\;\ge\;(n-i-(\text{pre}[n]-\text{pre}[i])) $$

    最优比较指标:

    score=n2i\textit{score} = |n - 2\cdot i|

    复杂度

    • 预处理前缀和:O(n)O(n)
    • 枚举所有位置:O(n)O(n) 总时间复杂度:O(n)O(n)

    可轻松处理 n3×105n\le 3\times 10^5、多组数据总长度不超过 3×1053\times 10^5 的范围。

    • 1

    信息

    ID
    6530
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者