UVA 11729Commando War

来源:互联网 发布:上海学声乐 知乎 编辑:程序博客网 时间:2024/06/07 04:06

非常简单的贪心算法

分配所有任务的总时间是一定有的。

执行时间长的任务先分配,这样任务并行执行重叠的部分就多,花的总时间就少。因此先按照执行时间大小顺序排列。

然后将时间流看成一个坐标轴,Bi是第i个任务的分配时间,Ji是第i个任务的执行时间,则坐标Xi中的最大者即为所求,显然图中的例子是X3


import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.Scanner;/* * TITLE: UVA 11729Commando 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 stubif(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);}}}



0 0