请看这道贪心算法题(AI都不会做) R1001. 【贪心算法】加工生产调度 ID: 1705 传统题 1000ms 256MiB 尝试: 3 已通过: 0 难度: 5 上传者:XuRain (徐嘉轩) 标签>

题目描述 某工厂收到了 n 个产品的订单,这 n 个产品分别在 A、B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工。

某个产品 i 在 A,B 两车间加工的时间分别为 Ai, Bi 。怎样安排这 n 个产品的加工顺序,才能使总的加工时间最短。

这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A,B 两车间加工完毕的时间。

输入格式 第一行仅—个数据 n ,表示产品的数量;

接下来 n 个数据是表示这 n 个产品在 A 车间加工各自所要的时间;

最后的 n 个数据是表示这 n 个产品在 B 车间加工各自所要的时间。

输出格式 第一行一个数据,表示最少的加工时间;

第二行是一种最小加工时间的加工顺序。

样例 输入数据 1

5

3 5 8 7 10

6 2 1 4 9

输出数据 1

34

1 5 4 2 3

提示 本题的 SPJ 对行尾多余空格敏感,各位输出答案时不要留行尾多余空格~

会做的大神留个答案

作答入口:点击进入

2 条评论

  • @ 2025-8-24 9:52:47

    账号名啥来着?

    • @ 2025-8-9 11:06:57

      答案来自DeepSeek-R1(看!不!懂!) 以下是使用贪心算法(Johnson法则)解决流水车间调度问题的Python代码:

      def main():
          n = int(input().strip())
          A = list(map(int, input().split()))
          B = list(map(int, input().split()))
          
          # 创建产品列表,每个元素为(产品编号, A时间, B时间)
          products = [(i + 1, a, b) for i, (a, b) in enumerate(zip(A, B))]
          
          # 分组处理
          group1 = []  # A <= B 的产品
          group2 = []  # A > B 的产品
          for p in products:
              if p[1] <= p[2]:
                  group1.append(p)
              else:
                  group2.append(p)
                  
          # 对第一组按A时间升序排序
          group1_sorted = sorted(group1, key=lambda x: x[1])
          # 对第二组按B时间降序排序
          group2_sorted = sorted(group2, key=lambda x: x[2], reverse=True)
          
          # 合并两组:第一组在前,第二组在后
          order = group1_sorted + group2_sorted
          
          # 计算总加工时间
          timeA = 0
          timeB = 0
          for product in order:
              timeA += product[1]  # 累加A车间时间
              # B车间开始时间为max(当前A车间完成时间, 上一个B车间完成时间)
              timeB = max(timeA, timeB) + product[2]
          
          # 输出结果
          print(timeB)
          print(" ".join(str(product[0]) for product in order))
      
      if __name__ == '__main__':
          main()
      

      代码解释:

      1. 输入处理:读取产品数量 n,A车间加工时间列表 A,B车间加工时间列表 B
      2. 产品分组
        • 第一组(group1):A车间时间 ≤ B车间时间的产品,按A时间升序排序。
        • 第二组(group2):A车间时间 > B车间时间的产品,按B时间降序排序。
      3. 合并序列:将第一组放在前面,第二组放在后面,形成最优加工顺序。
      4. 时间计算
        • timeA 记录A车间累计完成时间。
        • timeB 记录B车间累计完成时间(需等待A车间完成且B车间空闲)。
      5. 输出结果
        • 第一行:总加工时间(即最终的 timeB)。
        • 第二行:最优加工顺序(产品编号序列)。

      样例验证:

      输入:

      5
      3 5 8 7 10
      6 2 1 4 9
      

      输出:

      34
      1 5 4 2 3
      

      计算过程:

      1. 分组
        • 产品1:(3,6) → A≤B → 第一组
        • 产品2:(5,2) → A>B → 第二组
        • 产品3:(8,1) → A>B → 第二组
        • 产品4:(7,4) → A>B → 第二组
        • 产品5:(10,9) → A>B → 第二组
        • 第一组排序:[产品1]
        • 第二组按B降序:[产品5(B=9), 产品4(B=4), 产品2(B=2), 产品3(B=1)]
      2. 合并序列:[1, 5, 4, 2, 3]
      3. 时间模拟
        • 产品1:A=3 → timeA=3, B=6 → timeB=3+6=9
        • 产品5:A=10 → timeA=13, B=9 → timeB=max(13,9)+9=22
        • 产品4:A=7 → timeA=20, B=4 → timeB=max(20,22)+4=26
        • 产品2:A=5 → timeA=25, B=2 → timeB=max(25,26)+2=28
        • 产品3:A=8 → timeA=33, B=1 → timeB=max(33,28)+1=34

      此算法时间复杂度为O(n log n),符合贪心算法要求。

    • 1