非常简单的贪心算法
分配所有任务的总时间是一定有的。
执行时间长的任务先分配,这样任务并行执行重叠的部分就多,花的总时间就少。因此先按照执行时间大小顺序排列。
然后将时间流看成一个坐标轴,Bi是第i个任务的分配时间,Ji是第i个任务的执行时间,则坐标Xi中的最大者即为所求,显然图中的例子是X3
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
/*
* TITLE: UVA 11729 Commando War
* RUNTIME: 0.396 s
* TIME: 2015-11-07 13:18:11
*/
public class Main implements Comparable<Main>{
private int assignTaskTime; //交代任务的时间
private int doTaskTime; //执行任务的时间
public Main(int assignTaskTime, int doTaskTime) {
this.assignTaskTime = assignTaskTime;
this.doTaskTime = doTaskTime;
}
public int getAssignTaskTime() {
return assignTaskTime;
}
public void setAssignTaskTime(int assignTaskTime) {
this.assignTaskTime = assignTaskTime;
}
public int getDoTaskTime() {
return doTaskTime;
}
public void setDoTaskTime(int doTaskTime) {
this.doTaskTime = doTaskTime;
}
// public boolean CompareTo(Main next){
// return this.getDoTaskTime()>next.getDoTaskTime();
// }
public int compareTo(Main o) { //重写Comparable接口中的compareTo方法,贪心算法,按照任务时间从大到小排序
// TODO Auto-generated method stub
if(this.getDoTaskTime() < o.getDoTaskTime()){
return 1; //返回1,是 o大
}
return -1;
}
public static void main(String[] args) {
int n ;
int num = 0;
List<Main> list = new ArrayList<Main>(); //用对象保存一个任务 的‘分配时间’和‘完成时间’
Scanner scanner = new Scanner(System.in);
while((n=scanner.nextInt())!=0){
list.clear();
num++;
for(int i = 0 ;i<n;i++){
list.add(new Main(scanner.nextInt(),scanner.nextInt()));
}
Collections.sort(list); //按照‘完成时间’大小顺序排
int sum = 0 ; //完成所有任务的最短时间
int temp = 0;
for(Main m:list){
// System.out.println("time"+m.getDoTaskTime());
temp += m.getAssignTaskTime(); //保存分配完当前任务时已用的时间
if((temp+m.getDoTaskTime())>sum){
sum = temp+m.getDoTaskTime();
}
}
System.out.println("Case "+num+": "+sum);
}
}
}