Repository navigation
Expand file tree
/
Copy pathactivity_selection.rs
More file actions
149 lines (118 loc) · 3.79 KB
/
Copy pathactivity_selection.rs
File metadata and controls
149 lines (118 loc) · 3.79 KB
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
* 活动选择问题 - 选择最多数量的相容活动
*
* 算法:
* - 给定一组带有开始时间和结束时间的活动
* - 选择数量最多的互不重叠活动
* - 策略:按结束时间排序,然后贪心地选择活动
*
* 时间复杂度:O(n log n)(排序)
* 空间复杂度:O(n)(存储结果)
*/
#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
struct Activity {
id: usize,
start: usize,
end: usize,
}
impl Activity {
fn new(id: usize, start: usize, end: usize) -> Self {
Activity { id, start, end }
}
}
// 选择最多数量的不重叠活动
fn select_activities(mut activities: Vec<Activity>) -> Vec<Activity> {
if activities.is_empty() {
return vec![];
}
// 按结束时间排序
activities.sort_by_key(|a| a.end);
let mut selected = vec![activities[0].clone()];
let mut last_end_time = activities[0].end;
// 贪心选择剩余的活动
for activity in &activities[1..] {
if activity.start >= last_end_time {
selected.push(activity.clone());
last_end_time = activity.end;
}
}
selected
}
fn test_basic_example() {
println!("\n[Test 1] Basic example with overlapping activities");
let activities = vec![
Activity::new(1, 1, 3),
Activity::new(2, 2, 5),
Activity::new(3, 4, 6),
Activity::new(4, 6, 7),
Activity::new(5, 5, 8),
Activity::new(6, 8, 9),
];
let selected = select_activities(activities.clone());
println!("Input activities: {:?}", activities);
println!("Selected activities: {:?}", selected);
println!("Count: {}", selected.len());
}
fn test_all_compatible() {
println!("\n[Test 2] All activities compatible (non-overlapping)");
let activities = vec![
Activity::new(1, 1, 2),
Activity::new(2, 2, 3),
Activity::new(3, 3, 4),
Activity::new(4, 4, 5),
];
let selected = select_activities(activities);
println!("Selected activities: {:?}", selected);
println!("Count: {}", selected.len());
}
fn test_all_overlapping() {
println!("\n[Test 3] All activities overlapping");
let activities = vec![
Activity::new(1, 1, 10),
Activity::new(2, 2, 9),
Activity::new(3, 3, 8),
Activity::new(4, 4, 7),
];
let selected = select_activities(activities);
println!("Selected activities: {:?}", selected);
println!("Count: {}", selected.len());
}
fn test_single_activity() {
println!("\n[Test 4] Single activity");
let activities = vec![Activity::new(1, 5, 10)];
let selected = select_activities(activities);
println!("Selected activities: {:?}", selected);
println!("Count: {}", selected.len());
}
fn test_empty() {
println!("\n[Test 5] Empty input");
let activities: Vec<Activity> = vec![];
let selected = select_activities(activities);
println!("Selected activities: {:?}", selected);
println!("Count: {}", selected.len());
}
fn test_complex_scheduling() {
println!("\n[Test 6] Complex scheduling scenario");
let activities = vec![
Activity::new(1, 0, 6),
Activity::new(2, 1, 4),
Activity::new(3, 3, 5),
Activity::new(4, 5, 7),
Activity::new(5, 8, 9),
Activity::new(6, 5, 9),
];
let selected = select_activities(activities);
println!("Selected activities: {:?}", selected);
println!("Count: {}", selected.len());
}
fn main() {
println!("==================================================");
println!("ACTIVITY SELECTION - Greedy Algorithm (Rust)");
println!("==================================================");
test_basic_example();
test_all_compatible();
test_all_overlapping();
test_single_activity();
test_empty();
test_complex_scheduling();
}