-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy path1.cpp
118 lines (110 loc) · 2.51 KB
/
1.cpp
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
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
#define MAX 1000
#define QUANTA 4
int flag[MAX],at[MAX],bt[MAX],pt[MAX],rt[MAX],ft[MAX],fe[MAX],fe_flag[MAX],pid[MAX],tms,qt[MAX];
//at arrival time
//bt burst time
//rt Response Time
//pt priority
//pid process id
queue<int> q; //RR queue
void RR()
{
if(!q.empty())
{
if(rt[q.front()]>0 && qt[q.front()]<4)
{
qt[q.front()]++;
rt[q.front()]--;
if(rt[q.front()]==0)
{
ft[q.front()]=tms+1;
q.pop();
}
if(rt[q.front()]!=0 && qt[q.front()]==4)
{
qt[q.front()]=0;
q.push(q.front());
q.pop();
}
}
}
}
int main()
{
int i=0,n=0,smallest=0,last_smallest=-1,min,sum=0,large=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d %d %d %d",&pid[i],&at[i],&bt[i],&pt[i]);
if(at[i]>large)
large=at[i];
sum+=bt[i];
rt[i]=bt[i];
}
min=MAX;
for(tms=0;!q.empty() || tms<=sum+large ;tms++)
{
min=MAX;
smallest=-1;
for(i=0;i<n;i++)
{
if(at[i]<=tms && pt[i]<min && rt[i]>0 && !flag[i])
{
min=pt[i];
smallest=i;
}
}
if(smallest==-1 && !q.empty())
{
if(last_smallest !=-1 && rt[last_smallest]==0)
{
ft[last_smallest]=tms;
flag[last_smallest]=1;
}
last_smallest=-1;
RR();
continue;
}
else if(smallest!=-1 && !q.empty() && last_smallest==-1)
{
if(qt[q.front()]<=4 && qt[q.front()]>0)
{
q.push(q.front());
q.pop();
}
}
if(smallest!=-1 && !fe_flag[smallest])
{
fe[smallest]=tms-at[smallest];
fe_flag[smallest]=1;
}
if( smallest!=last_smallest && last_smallest!=-1 && !flag[last_smallest])
{
q.push(last_smallest);
flag[last_smallest]=1;
}
if(smallest !=-1)
rt[smallest]--;
if((smallest !=-1) && ((rt[smallest]==0) ||(bt[smallest]-rt[smallest])==QUANTA))
{
if((bt[smallest]-rt[smallest])==QUANTA && rt[smallest]!=0)
{
flag[smallest]=1;
q.push(smallest);
}
else if(smallest!=-1)
{
ft[smallest]=tms+1;
flag[smallest]=1;
}
}
last_smallest=smallest;
}
for(int i=0;i<n;i++)
cout<<pid[i]<<" "<<fe[i]<<" "<<ft[i]<<" "<<ft[i]-bt[i]-at[i]<<endl;
return 0;
}