"""
題目:給定n個作業的集合{J1,J2,…,Jn}。每個作業必須先由機器1處理,然后由機器2處理。所有任務必須先由機器1處理完成后,才能由機器2處理,并且在機器2的處理順序必須與機器1的處理順序一致,處理順序一旦確定不能改變。設作業Ji需要機器1的處理時間為Ai,需要機器2的處理時間為Bi,怎樣安排這n個產品的加工順序,才能使總的加工時間最短。
這里所說的加工時間是指:從開始加工第一個產品到最后所有的產品都已在 A、B 兩車間加工完畢的時間。
要求:對于給定的n個作業,計算最佳的加工方案所用的加工時間,并輸出所有的最佳加工方案(最佳【耗時最少】的加工方案不一定只有一種)。
輸入格式:
第一行一個整數,表示作業的數量n
第二行n個整數表示這n個產品在機器1上加工所需要的時間,整數之間以空格分隔。
第三行n個整數表示這n個產品在機器2上加工所需要的時間,整數之間以空格分隔。
輸出格式:
第一行輸出最優調度的加工時間是T,T表示計算出來的最優加工時間。
第二行輸出最優調度方案有N種,分別是:,N表示最優加工時間的種類,
接下來N行輸出每種方案的調度方案順序,以字典序排序輸出。
輸入樣例:
3
2 3 2
1 1 3
輸出樣例:
最優調度的加工時間是8
最優調度方案有3種,分別是:
132
312
321
"""
?
from itertools import permutationsdef job_scheduling(n, machine1, machine2):jobs = [(machine1[i], machine2[i], i+1) for i in range(n)]min_time = float('inf')best_schedules = []for schedule in permutations(jobs):time1 = time2 = 0for job in schedule:time1 += job[0]time2 = max(time2, time1) + job[1]if time2 < min_time:min_time = time2best_schedules = [schedule]elif time2 == min_time:best_schedules.append(schedule)return min_time, [[job[2] for job in schedule] for schedule in best_schedules]# 輸入
n = int(input())
machine1 = list(map(int, input().split()))
machine2 = list(map(int, input().split()))# 計算并輸出最優調度的加工時間和方案
time, orders = job_scheduling(n, machine1, machine2)
print('最優調度的加工時間是', time)
print('最優調度方案有{}種,分別是:'.format(len(orders)))
for order in sorted(orders):print(''.join(map(str, order)))