关闭工位

关闭工位

https://www.nowcoder.com/practice/b0612f43fb284691bd3dbb20ac9413f3

关闭工位

题目分析

工厂有 个工位,需要关闭恰好 个工位以节能。给定 个偏差值,分别对应工位 的质量偏差。要求不能同时关闭相邻的两个工位,在满足约束的前提下最小化总偏差。若无合法方案则输出

思路

经典不相邻选取 DP

个物品中选 个不相邻的,使权值之和最小。这是经典问题。

个物品中,最多能选 个不相邻的。若 ,直接返回

为从前 个物品中选 个不相邻物品的最小偏差和:

$$

  • 不选第 个:继承
  • 选第 个:第 个不能选,从 转移

初始条件:

用滚动数组优化空间,只保留前两行。

以样例验证。选物品 2 和 4(不相邻),偏差

复杂度

  • 时间复杂度:
  • 空间复杂度:,滚动数组优化后

代码

import sys

def main():
    input_data = sys.stdin.read().split()
    idx = 0
    T = int(input_data[idx]); idx += 1
    k = int(input_data[idx]); idx += 1
    n = T - 1
    dev = []
    for i in range(n):
        dev.append(int(input_data[idx])); idx += 1

    if k == 0:
        print(0)
        return

    max_sel = (n + 1) // 2
    if k > max_sel:
        print(-1)
        return

    INF = float('inf')
    prev2 = [INF] * (k + 1)
    prev1 = [INF] * (k + 1)
    prev2[0] = 0
    prev1[0] = 0
    prev1[1] = dev[0]

    for i in range(2, n + 1):
        curr = [INF] * (k + 1)
        for j in range(k + 1):
            curr[j] = prev1[j]  # 不选第 i 个
            if j > 0 and prev2[j - 1] < INF:
                curr[j] = min(curr[j], prev2[j - 1] + dev[i - 1])  # 选第 i 个
        prev2 = prev1
        prev1 = curr

    print(prev1[k])

main()

复杂度

  • 时间复杂度:
  • 空间复杂度:
全部评论

相关推荐

03-27 16:40
已编辑
门头沟学院 C++
26学院本太难了,很多公司机筛就给我刷了。机会都难拿到如果是简历存在问题也欢迎拷打————————————————————分割线——————————————————————2026.3.4更新:发完贴之后,时不时投递又收到了不少的笔试/面试邀请。主要是之前投递简历出去之后基本上都是沉默状态,年后好转了不少timeline:2026.01.21&nbsp;文远知行笔试,半年多没刷算法题&nbsp;-&gt;挂&nbsp;(后续HR说春招可以重新安排笔试)2026.2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;小鹏汇天&nbsp;技术一面,第二周收到结果&nbsp;-&gt;挂2026.2.12&nbsp;&nbsp;&nbsp;大众Cariad代招&nbsp;技术二面&nbsp;-&gt;Offer2026.2.28&nbsp;&nbsp;&nbsp;多益网络技术面试,由于风评太差,一直在犹豫要不要接面试&nbsp;-&gt;推迟-----------分割线-----------2026.3&nbsp;月前的某一天,临时去电网报名了二批计算机岗位的笔试2026.3.6&nbsp;从上家公司实习离职,氛围最好的一家公司,leader&nbsp;说可以帮忙转正,但是流程太长,而且我们部门据说只有一个&nbsp;hc,更想要研究生,我很有可能是会被签外包公司在这里干活,就离职了。2026.3.9&nbsp;入职新公司,大众Cariad&nbsp;以外部公司的身份进组,项目组签了三年,后续三年应该都可以在这里呆,不知道有没有希望原地跳槽。2026.3.10&nbsp;电网考试居然说我通过资格审查了,短信约我去参加资格审查,请假一天,买了&nbsp;12&nbsp;号晚上的机票回成都2026.3.15&nbsp;参加国家电网计算机类笔试2026.3.17&nbsp;电网出成绩了,感觉很低。觉得已经🈚️了2026.3.18&nbsp;收到电网面试通知,通知&nbsp;3.22-3.25&nbsp;这个时间去面试,我的岗位只招&nbsp;1&nbsp;个人。据说面试只有&nbsp;2-3&nbsp;人,不知道能不能成功----------分割线-----------2026.3.21&nbsp;电网面试结束,感觉回答的还勉勉强强,大概是2个岗位分别招1个人,一共11人面试,实际来了9人2026.3.27&nbsp;出面试成绩,满分100分,早上10:20左右发现面试成绩46,我震惊了,没截图,后面过了十分钟重新看发现面试成绩给我改成58了。但同样震惊。朋友问我是不是把面试官打了,哈哈
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务