HUAWEI机试题:流水线

希望有更好的解法

题目描述

N个产品每个产品有M个零件,Aij表示生产该零件的生产时间
需满足以下2个条件

  1. Aij需要生产出来必须保证Ai-1 j先生产出来
  2. Aij需要生产出来必须保证Ai j-1先生产出来

输入描述:

第一行输入两个数,用空格隔开,第一个代表N:N个产品;第二个代表M:每个产品M个零件
第二行之后,Aij表示生产该零件的生产时间
i行:每一行代表第i个产品
j列:每一列代表第i个产品的第j个零件

输出描述:

输出所有产品的生产时间

示例:

输入:
1 3
3.0
2.0
1.0
输出:6.000000

输入:
3 1
3.0 2.0 1.0
输出6.000000

输入:
2 4
10.000000 5.000000
4.500000 3.000000
4.499999 2.000000
2.000000 1.000000
输出:21.999999

分析

分析 21.999999 是个什么玩意
最后一个输入输出,输入的和是31.99999,但输出是21.99999,因此可以判定,在流水线上,零件生产是应接不暇的,存在多条生产线
当零件满足条件时就开始生产了
假设多条生产线,有一条前置生产线,这条生产线完成,之后的零件才可以完成,这条生产线未完成,之后的零件生成需要等待
前置条件先完成,不用等待
前置条件后完成,需要等待

最终得出规律,算出生产最后一个零件的前置零件,最长的用时,加上这个零件的生产用时
将此题目引申到矩阵,就是递归得出前置项的加和最大值

Python解法( 不用numpy )

class Time:
    def __init__(self,time,Maxtime):
        self.time = time
        self.maxtime = Maxtime + time
lst = list(map(int,input().split()))
N = lst[0] # 代表列
M = lst[1] # 代表行

lst = []
for i in range(M):
    lst.append(list(map(float,input().split())))
print(lst)

# 模拟一个小矩阵
'''
lst[0][0] = Time(lst[0][0],0)
print(type(lst[0][0]),lst[0][0].time,lst[0][0].maxtime)

lst[0][1] = Time(lst[0][1],lst[0][0].maxtime)
print(lst[0][1].time,lst[0][1].maxtime)

lst[1][0] = Time(lst[1][0],lst[0][0].maxtime)
print(lst[1][0].time,lst[1][0].maxtime)

lst[1][1] = Time(lst[1][1],lst[0][1].maxtime if lst[0][1].maxtime >= lst[1][0].maxtime else lst[1][0].maxtime)
print(lst[1][1].maxtime)
'''
# y出一个大矩阵
for i in range(M):
    for j in range(N):
        if i == 0 and j == 0:
            lst[0][0] = Time(lst[0][0],0)
        elif i == 0:
            lst[0][j] = Time(lst[0][j],lst[0][j-1].maxtime)
        elif j == 0:
            lst[i][0] = Time(lst[i][0],lst[i-1][0].maxtime)
        else:
            lst[i][j] = Time(lst[i][j],lst[i-1][j].maxtime if lst[i-1][j].maxtime >= lst[i][j-1].maxtime else lst[i][j-1].maxtime)

print(lst[M-1][N-1].maxtime)
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值