python实现洛谷P1065 [NOIP2006 提高组] 作业调度方案:

  • 模拟

    纯模拟+阅读理解,太恶心了

    要满足的就是按序插入每一次插入时从左往右找空插入需要记录每个工件当前所处的时刻,因为同一个工件的加工顺序不能乱

    刚开始思路有点问题,不用判断机器所处的时间,只要不断尝试往里插空就行,测试点7没过,看了一下其他解法也没过,不知道什么问题

    m,n=map(int,input().split())#m机器数 n工件数 m也代表工序数
    shunxu=list(map(int,input().split()))#加工顺序
    jiqihao=[]
    shijian=[]
    for i in range(n):
        jiqihao.append(list(map(int,input().split())))
        #每个工件的每个工序所使用的机器号
    for i in range(n):
        shijian.append(list(map(int,input().split())))
        #每个工件的每个工序的加工时间
    gongjiannow=[0]*n#记录每个工件当前所处的时刻
    moni=[[0]*m*n*20 for _ in range(m)]#模拟每个机器的安排
    #按顺序插入 i代表几号工件,j代表第几道工序,jiqi代表第几台机器
    for k in range(n*m):
        i=shunxu[k]-1
        j=shunxu[:k+1].count(shunxu[k])-1
        jiqi=jiqihao[i][j]-1
        t=max(moni[jiqi].index(0),gongjiannow[i])
        while True:
            # print(t,t+shijian[i][j])
            # print(moni[jiqi][t:t+shijian[i][j]].count(0))
            if moni[jiqi][t:t+shijian[i][j]].count(0)<shijian[i][j]:
                t+=1
            else:
                gongjiannow[i]=t+shijian[i][j]
                for l in range(shijian[i][j]):
                    moni[jiqi][t+l]=i+1
                break
        # print(moni)
        # input()
    print(max(gongjiannow))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值