#include <iostream>
using namespace std;
struct Process {
int id;
int burst_time;
int priority;
int arrival_time;
int remaining_time;
};
void sortProcessesByArrival(Process processes[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (processes[j].arrival_time > processes[j + 1].arrival_time) {
Process temp = processes[j];
processes[j] = processes[j + 1];
processes[j + 1] = temp;
} else if (processes[j].arrival_time == processes[j + 1].arrival_time &&
processes[j].priority > processes[j + 1].priority) {
Process temp = processes[j];
processes[j] = processes[j + 1];
processes[j + 1] = temp;
}
}
}
}
void preemptivePriorityScheduling(Process processes[], int n) {
int waiting_time[100];
int completed[100] = {0};
int time = 0;
int remaining_processes = n;
sortProcessesByArrival(processes, n);
while (remaining_processes > 0) {
int idx = -1;
for (int i = 0; i < n; i++) {
if (!completed[i] && processes[i].arrival_time <= time && processes[i].remaining_time > 0) {
if (idx == -1 || processes[i].priority < processes[idx].priority) {
idx = i;
}
}
}
if (idx != -1) {
processes[idx].remaining_time--;
time++;
if (processes[idx].remaining_time == 0) {
completed[idx] = 1;
remaining_processes--;
waiting_time[idx] = time - processes[idx].arrival_time - processes[idx].burst_time;
}
} else {
time++;
}
}
cout << "Process ID | Burst Time | Arrival Time | Priority | Waiting Time\n";
for (int i = 0; i < n; i++) {
cout << " " << processes[i].id << " | "
<< processes[i].burst_time << " | "
<< processes[i].arrival_time << " | "
<< processes[i].priority << " | "
<< waiting_time[i] << endl;
}
}
int main() {
int n;
cout << "Enter number of processes: ";
cin >> n;
Process processes[100];
for (int i = 0; i < n; i++) {
cout << "Enter burst time, arrival time, and priority for process " << i + 1 << ": ";
cin >> processes[i].burst_time >> processes[i].arrival_time >> processes[i].priority;
processes[i].id = i + 1;
processes[i].remaining_time = processes[i].burst_time;
}
preemptivePriorityScheduling(processes, n);
return 0;
}