0%

日程安排问题

问题

一些项目要占用一个会议室宣讲, 会议室不能同时容纳两个项目的宣讲. 给定每个项目的开始和结束时间 (输入为数组, 其中是一个个具体的项目), 合理安排宣讲日程, 使得会议室进行的宣讲场次最多, 返回这个最多的场次

题解

本题不可按开始时间排序, 若某个宣讲开始时间早但持续时间长, 可能不如多个晚开始的宣讲场次多; 也不可按持续时间长短, 某个短时间的宣讲可能与其它宣讲的起始时间重叠.

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Program {
int start;
int end;

public Program(int start, int end) {
this.start = start;
this.end = end;
}
}

public class BestArrange {
public static int bestArrange(Program[] programs, int start) {
Arrays.sort(programs, (a, b) -> a.end - b.end);
int result = 0;

for (Program program : programs) {
if (start <= program.start) {
result++;
start = program.end;
}
}

return result;
}
}

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Program:
def __init__(self, start, end):
self.start = start
self.end = end


def get_best_arrange(programs, start):
programs.sort(key=lambda x: x.end)
result = 0

for program in programs:
if start <= program.start:
result += 1
start = program.end

return result

Go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
type Program struct {
start, end int
}

func getBestArrange(programs []Program, start int) int {
for i := 0; i < len(programs); i++ {
for j := 0; j < len(programs)-1; j++ {
if programs[j].end > programs[j+1].end {
programs[j], programs[j+1] = programs[j+1], programs[j]
}
}
}
result := 0

for _, program := range programs {
if start <= program.start {
result++
start = program.end
}
}

return result
}