活动选择问题


Question

在活动选择问题中,我们给出不同的活动和每个活动的开始及结束时间,假设一个人在同一时间段下只能参加一场活动,找出其能够参加的活动的最大数量。(1, 4), (3, 5), (0, 6), (5, 7), (3, 8), (5, 9), (6, 10), (8, 11), (8, 12), (2, 13), (12, 14)。
输出格式:(1,4) (5,7) (8,11) (12,14)



Code

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import java.util.*;

//Simple pair class to store the start time and finish time
//of the activities
class Pair
{
private int start, finish;

public Pair(int start, int finish) {
this.start = start;
this.finish = finish;
}

public int getFinish() {
return finish;
}

public int getStart() {
return start;
}

public String toString() {
return "(" + getStart() + " " + getFinish() + ")";
}
};

public class A080
{
public static Set<Integer> selectActivity(List<Pair> activities)
{
int k = 0;
Set<Integer> out = new HashSet<>();

out.add(0);
for (int i = 1; i < activities.size(); i++)
{
if (activities.get(i).getStart() >= activities.get(k).getFinish())
{
out.add(i);
k = i;
}
}

return out;
}

public static void main(String[] args)
{
List<Pair> activities = Arrays.asList(new Pair(1, 4), new Pair(3, 5),
new Pair(0, 6), new Pair(5, 7), new Pair(3, 8),
new Pair(5, 9), new Pair(6, 10), new Pair(8, 11),
new Pair(8, 12), new Pair(2, 13), new Pair(12, 14));

Collections.sort(activities, (a, b) -> a.getFinish() - b.getFinish());

Set<Integer> res = selectActivity(activities);

for (Integer i: res) {
System.out.print(activities.get(i));
}
}
}