问题:已经n安装任务,知道每个任务完成所需时间serveTime及截止时间deadline,任务的惩罚时间定义为完成时间减去截止时间,要求最大惩罚时间和次在惩罚时间之和最小。
思路:使用贪心算法,将n个任务按照截止时间从小到大排列,如果截止时间相同,根据任务完成所需时间排列。此时的最大惩罚时间最小。此时最大处罚时间和次大处罚时间之和可能不时最大。在排序后,记录下此时的前两个最大的位置,记为p1,p2.分下面几种情况考虑。
1、在p1之前的任意两个互换,因为此时p1,p2位置的两处惩罚值不变,而互换后0到p1之间计算的值可能会大于p1时的值,结果可能会大于等于p1处的惩罚值,最后的惩罚值之和会变大。
2、p2之后的任意两个互换,与上面一样,惩罚值可能会变大。
3、p1之前的与p1、p2之间互换。会使p1变大,p2没有变。最终是变大。
4、p2之后的与p1、p2之间互换,与上面一样,最终是变大。
5、[0,p1]与p2之后的位置互换,将[0,p1]移到p2的后一个是最优的。因为将[0,p1]中的一个移动到p2之后的任意位置,相当于先移动到p2的后一个后,再与p2后的任意位置作互换。
具体代码参考:
https://github.com/wuli2496/OJ/tree/master/UVa/1467%20Installations