本文共 1404 字,大约阅读时间需要 4 分钟。
为了解决这个问题,我们需要找到一个作业顺序,使得总扣分最少,并且如果有多个最优解,选择字典序最小的那个。这个问题可以通过动态规划来解决,结合状态压缩和字典序处理。
问题分析:每个作业都有一个截止日期和完成时间,延迟完成会导致扣分。我们需要找到完成作业的最优顺序。
动态规划:使用动态规划来记录每个状态的最小扣分和完成时间。状态用二进制表示,表示完成的作业集合。
状态转移:对于每个状态,尝试添加每个未完成的作业,计算新的状态和扣分,更新动态规划数组。
字典序处理:在动态规划中,优先处理字典序较小的作业,确保最终解是字典序最小的。
生成顺序:通过反向遍历前驱信息,生成作业完成顺序,确保字典序最小。
import sysimport mathdef main(): input = sys.stdin.read().split() ptr = 0 T = int(input[ptr]) ptr += 1 for _ in range(T): n = int(input[ptr]) ptr += 1 subjects = [] for _ in range(n): name = input[ptr] D = int(input[ptr+1]) C = int(input[ptr+2]) ptr +=3 subjects.append( (name, D, C) ) subjects.sort() INF = float('inf') dp = [ (INF, 0) for _ in range(1< << n) -1 best_score, best_time = dp[full] order = [] current = full while current !=0: j = prev[current][1] order.append( (subjects[j][0], j) ) current = prev[current][0] order.sort() for name, j in order: print(name) print(best_score) if __name__ == "__main__": main() dp和前驱数组prev,记录每个状态的最小扣分和完成时间。这个方法通过动态规划和状态压缩,有效地解决了问题,并确保了在相同扣分的情况下,选择字典序最小的作业顺序。
转载地址:http://qulx.baihongyu.com/