用java语言怎么编程现有n件任务和⽆限多台的机器,任务可以在机器上得到处理。每件任务的开始时间为s i,完成时间为fi, si < fi 。[si, fi]为处理任务i的时间范围。两个任务i,j重叠是指两个任务的时间范围区间有重叠,⽽并⾮是指i,j的起点或终点重合。每台机器在任何时刻最多只处理⼀个任务。最优分配是指使⽤的机器最少的可⾏分配⽅案,基本要求(1)输⼊任务个数及每个任务的名称,开始时间,完成时间给出最优分配⽅案。
时间: 2024-03-23 08:42:51 浏览: 52
这是一个经典的任务调度问题,可以使用贪心算法解决。
首先,我们将任务按照完成时间从小到大排序,然后依次分配机器。对于每个任务,我们找到当前空闲的机器中完成时间最早的那台机器,并将任务分配给它。如果当前没有空闲机器,我们就再开一台新机器。
Java代码实现如下:
```java
import java.util.*;
public class TaskScheduler {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
List<Task> tasks = new ArrayList<>();
for (int i = 0; i < n; i++) {
String name = scanner.next();
int start = scanner.nextInt();
int end = scanner.nextInt();
tasks.add(new Task(name, start, end));
}
Collections.sort(tasks, Comparator.comparingInt(Task::getEnd));
List<List<Task>> machines = new ArrayList<>();
for (Task task : tasks) {
boolean assigned = false;
for (List<Task> machine : machines) {
if (machine.get(machine.size() - 1).getEnd() <= task.getStart()) {
machine.add(task);
assigned = true;
break;
}
}
if (!assigned) {
List<Task> newMachine = new ArrayList<>();
newMachine.add(task);
machines.add(newMachine);
}
}
System.out.println("需要的机器数:" + machines.size());
for (int i = 0; i < machines.size(); i++) {
List<Task> machine = machines.get(i);
System.out.println("机器" + (i + 1) + "执行的任务:");
for (Task task : machine) {
System.out.println(task.getName() + " " + task.getStart() + " " + task.getEnd());
}
}
}
}
class Task {
private String name;
private int start;
private int end;
public Task(String name, int start, int end) {
this.name = name;
this.start = start;
this.end = end;
}
public String getName() {
return name;
}
public int getStart() {
return start;
}
public int getEnd() {
return end;
}
}
```
输入样例:
```
5
A 1 4
B 3 5
C 0 6
D 5 7
E 3 8
```
输出样例:
```
需要的机器数:2
机器1执行的任务:
C 0 6
A 1 4
D 5 7
机器2执行的任务:
B 3 5
E 3 8
```
阅读全文