มีกิจกรรมที่แตกต่างกัน n กิจกรรมที่มีเวลาเริ่มต้นและเวลาสิ้นสุด เลือกจำนวนกิจกรรมสูงสุดที่จะแก้ไขโดยบุคคลคนเดียว
เราจะใช้วิธีการแบบตะกละตะกลามเพื่อค้นหากิจกรรมถัดไปที่มีเวลาสิ้นสุดน้อยที่สุดในกิจกรรมที่เหลือ และเวลาเริ่มต้นมีค่ามากกว่าหรือเท่ากับเวลาสิ้นสุดของกิจกรรมที่เลือกล่าสุด
-
ความซับซ้อนของปัญหานี้คือ O(n log n) เมื่อไม่ได้เรียงลำดับรายการ เมื่อเรียงลำดับรายการแล้ว ความซับซ้อนจะเป็น O(n)
อินพุต
รายการกิจกรรมต่างๆ ที่มีเวลาเริ่มต้นและสิ้นสุด
{(5,9), (1,2), (3,4), (0,6), (5,7), (8,9)} ผลลัพธ์
กิจกรรมที่เลือกคือ −
Activity: 0 , Start: 1 End: 2 Activity: 1 , Start: 3 End: 4 Activity: 3 , Start: 5 End: 7 Activity: 5 , Start: 8 End: 9
อัลกอริทึม
maxActivity(การกระทำ ขนาด)
ป้อนข้อมูล - รายการกิจกรรมและจำนวนองค์ประกอบในรายการ
ผลผลิต - ลำดับของกิจกรรมที่ได้รับการคัดเลือก
Begin initially sort the given activity List set i := 1 display the i-th activity //in this case it is the first activity for j := 1 to n-1 do if start time of act[j] >= end of act[i] then display the jth activity i := j done End
ตัวอย่าง
#include<iostream>
#include<algorithm>
using namespace std;
struct Activitiy {
int start, end;
};
bool comp(Activitiy act1, Activitiy act2) {
return (act1.end < act2.end);
}
void maxActivity(Activitiy act[], int n) {
sort(act, act+n, comp); //sort activities using compare function
cout << "Selected Activities are: " << endl;
int i = 0;// first activity as 0 is selected
cout << "Activity: " << i << " , Start: " <<act[i].start << " End: " << act[i].end <<endl;
for (int j = 1; j < n; j++) { //for all other activities
if (act[j].start >= act[i].end) { //when start time is >=end time, print the activity
cout << "Activity: " << j << " , Start: " <<act[j].start << " End: " << act[j].end <<endl;
i = j;
}
}
}
int main() {
Activitiy actArr[] = {{5,9},{1,2},{3,4},{0,6},{5,7},{8,9}};
int n = 6;
maxActivity(actArr,n);
return 0;
} ผลลัพธ์
Selected Activities are: Activity: 0 , Start: 1 End: 2 Activity: 1 , Start: 3 End: 4 Activity: 3 , Start: 5 End: 7 Activity: 5 , Start: 8 End: 9