#include<bits/stdc++.h>
using namespace std;
class T{
public:
string process;
int burstTime;
int priority;
int arrival;
int wt = 0;
T(){};
T(string pro, int bas, int pri, int ari){
this->process = pro;
this->burstTime = bas;
this->priority = pri;
this->arrival = ari;
}
};
void Merge(vector<T>&A, int L, int M, int R){
int n1 = M - L + 1;
int n2 = R - M;
vector<T>X(n1), Y(n2);
for(int i = 0; i < n1; i++){
X[i] = A[L+i];
}
for(int i = 0; i < n2; i++){
Y[i] = A[M+1+i];
}
int i = 0, j = 0, k = L;
while(i < n1 and j < n2){
if(X[i].arrival == Y[j].arrival){
if(X[i].priority < Y[j].priority) A[k++] = X[i++];
else A[k++] = Y[j++];
}
else if(X[i].arrival < Y[j].arrival) A[k++] = X[i++];
else A[k++] = Y[j++];
}
while(i < n1) A[k++] = X[i++];
while(j < n2) A[k++] = Y[j++];
}
void mergeSort(vector<T>&A, int L, int R){
if(L < R){
int M = (L + R) / 2;
mergeSort(A, L, M);
mergeSort(A, M+1, R);
Merge(A, L, M, R);
}
}
vector<string> DoWork(vector<T>t, int n){
vector<T>demo;
vector<string>v;
for(int i = 0; i < n; i++){
demo.push_back(t[i]);
sort(demo.begin(), demo.end(), [](T &a, T &b) {
return a.priority < b.priority;
});
demo[0].burstTime--;
v.push_back(demo[0].process);
if(demo[0].burstTime == 0) demo.erase(demo.begin() + 0);
}
while(!demo.empty()){
demo[0].burstTime--;
v.push_back(demo[0].process);
if(demo[0].burstTime == 0) demo.erase(demo.begin() + 0);
}
return v;
}
void calculateWitingTime(vector<T>&A, vector<string>v){
int n = A.size(), l = v.size();
for(int i = 0; i < n; i++){
int ct;
for(int j = l-1; j >= 0; j--){
if(v[j] == A[i].process){
ct = j+1; break;
}
}
A[i].wt = ct - A[i].arrival - A[i].burstTime;
}
}
void showGanttChart(vector<string>v){
int n = v.size();
cout << "Gantt Chart : " << endl;
for(auto u : v){
cout << u << " ";
}
cout << endl << endl;
}
void showWaitingTime(vector<T>A, int n){
float total = 0.0;
cout << "Waiting Times : " << endl;
for(int i = 0; i < n; i++){
cout << A[i].process << " ==> " << A[i].wt << endl;
total += A[i].wt;
}
cout << endl;
cout << "Average Waiting Time : " << fixed << setprecision(2) << total / n << endl;
}
int main(){
int n; cin >> n;
vector<T>t(n);
for(int i = 0; i < n; i++){
string pro; cin >> pro;
int bas, pri, ari; cin >> bas >> pri >> ari;
t[i] = T(pro, bas, pri, ari);
}
mergeSort(t, 0, n-1);
vector<string>ans = DoWork(t, n);
showGanttChart(ans);
calculateWitingTime(t, ans);
showWaitingTime(t, n);
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFR7CiAgICBwdWJsaWM6CiAgICAgICAgc3RyaW5nIHByb2Nlc3M7CiAgICAgICAgaW50IGJ1cnN0VGltZTsKICAgICAgICBpbnQgcHJpb3JpdHk7CiAgICAgICAgaW50IGFycml2YWw7CgogICAgICAgIGludCB3dCA9IDA7CgogICAgICAgIFQoKXt9OwoKICAgICAgICBUKHN0cmluZyBwcm8sIGludCBiYXMsIGludCBwcmksIGludCBhcmkpewogICAgICAgICAgICB0aGlzLT5wcm9jZXNzID0gcHJvOwogICAgICAgICAgICB0aGlzLT5idXJzdFRpbWUgPSBiYXM7CiAgICAgICAgICAgIHRoaXMtPnByaW9yaXR5ID0gcHJpOwogICAgICAgICAgICB0aGlzLT5hcnJpdmFsID0gYXJpOwogICAgICAgIH0KfTsKCnZvaWQgTWVyZ2UodmVjdG9yPFQ+JkEsIGludCBMLCBpbnQgTSwgaW50IFIpewogICAgaW50IG4xID0gTSAtIEwgKyAxOwogICAgaW50IG4yID0gUiAtIE07CiAgICB2ZWN0b3I8VD5YKG4xKSwgWShuMik7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjE7IGkrKyl7CiAgICAgICAgWFtpXSA9IEFbTCtpXTsKICAgIH0KICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuMjsgaSsrKXsKICAgICAgICBZW2ldID0gQVtNKzEraV07CiAgICB9CgogICAgaW50IGkgPSAwLCBqID0gMCwgayA9IEw7CiAgICB3aGlsZShpIDwgbjEgYW5kIGogPCBuMil7CiAgICAgICAgaWYoWFtpXS5hcnJpdmFsID09IFlbal0uYXJyaXZhbCl7CiAgICAgICAgICAgIGlmKFhbaV0ucHJpb3JpdHkgPCBZW2pdLnByaW9yaXR5KSBBW2srK10gPSBYW2krK107CiAgICAgICAgICAgIGVsc2UgQVtrKytdID0gWVtqKytdOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKFhbaV0uYXJyaXZhbCA8IFlbal0uYXJyaXZhbCkgQVtrKytdID0gWFtpKytdOwogICAgICAgIGVsc2UgQVtrKytdID0gWVtqKytdOwogICAgfQoKICAgIHdoaWxlKGkgPCBuMSkgQVtrKytdID0gWFtpKytdOwogICAgd2hpbGUoaiA8IG4yKSBBW2srK10gPSBZW2orK107Cn0KCnZvaWQgbWVyZ2VTb3J0KHZlY3RvcjxUPiZBLCBpbnQgTCwgaW50IFIpewogICAgaWYoTCA8IFIpewogICAgICAgIGludCBNID0gKEwgKyBSKSAvIDI7CiAgICAgICAgbWVyZ2VTb3J0KEEsIEwsIE0pOwogICAgICAgIG1lcmdlU29ydChBLCBNKzEsIFIpOwogICAgICAgIE1lcmdlKEEsIEwsIE0sIFIpOwogICAgfQp9Cgp2ZWN0b3I8c3RyaW5nPiBEb1dvcmsodmVjdG9yPFQ+dCwgaW50IG4pewogICAgdmVjdG9yPFQ+ZGVtbzsKICAgIHZlY3RvcjxzdHJpbmc+djsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspewogICAgICAgIGRlbW8ucHVzaF9iYWNrKHRbaV0pOwoKICAgICAgICBzb3J0KGRlbW8uYmVnaW4oKSwgZGVtby5lbmQoKSwgW10oVCAmYSwgVCAmYikgewogICAgICAgICAgICByZXR1cm4gYS5wcmlvcml0eSA8IGIucHJpb3JpdHk7CiAgICAgICAgfSk7CgogICAgICAgIGRlbW9bMF0uYnVyc3RUaW1lLS07CiAgICAgICAgdi5wdXNoX2JhY2soZGVtb1swXS5wcm9jZXNzKTsKICAgICAgICBpZihkZW1vWzBdLmJ1cnN0VGltZSA9PSAwKSBkZW1vLmVyYXNlKGRlbW8uYmVnaW4oKSArIDApOwogICAgfQoKICAgIHdoaWxlKCFkZW1vLmVtcHR5KCkpewogICAgICAgIGRlbW9bMF0uYnVyc3RUaW1lLS07CiAgICAgICAgdi5wdXNoX2JhY2soZGVtb1swXS5wcm9jZXNzKTsKICAgICAgICBpZihkZW1vWzBdLmJ1cnN0VGltZSA9PSAwKSBkZW1vLmVyYXNlKGRlbW8uYmVnaW4oKSArIDApOwogICAgfSAgCiAgICByZXR1cm4gdjsKfQoKdm9pZCBjYWxjdWxhdGVXaXRpbmdUaW1lKHZlY3RvcjxUPiZBLCB2ZWN0b3I8c3RyaW5nPnYpewogICAgaW50IG4gPSBBLnNpemUoKSwgbCA9IHYuc2l6ZSgpOwogICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKyl7CiAgICAgICAgaW50IGN0OwogICAgICAgIGZvcihpbnQgaiA9IGwtMTsgaiA+PSAwOyBqLS0pewogICAgICAgICAgICBpZih2W2pdID09IEFbaV0ucHJvY2Vzcyl7CiAgICAgICAgICAgICAgICBjdCA9IGorMTsgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgQVtpXS53dCA9IGN0IC0gQVtpXS5hcnJpdmFsIC0gQVtpXS5idXJzdFRpbWU7CiAgICB9IAp9Cgp2b2lkIHNob3dHYW50dENoYXJ0KHZlY3RvcjxzdHJpbmc+dil7CiAgICBpbnQgbiA9IHYuc2l6ZSgpOwogICAgY291dCA8PCAiR2FudHQgQ2hhcnQgOiAiIDw8IGVuZGw7CiAgICBmb3IoYXV0byB1IDogdil7IAogICAgICAgIGNvdXQgPDwgdSA8PCAiICI7CiAgICB9CiAgICBjb3V0IDw8IGVuZGwgPDwgZW5kbDsKfQoKdm9pZCBzaG93V2FpdGluZ1RpbWUodmVjdG9yPFQ+QSwgaW50IG4pewogICAgZmxvYXQgdG90YWwgPSAwLjA7CiAgICBjb3V0IDw8ICJXYWl0aW5nIFRpbWVzIDogIiA8PCBlbmRsOwogICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKyl7CiAgICAgICAgY291dCA8PCBBW2ldLnByb2Nlc3MgPDwgIiA9PT4gIiA8PCBBW2ldLnd0IDw8IGVuZGw7CiAgICAgICAgdG90YWwgKz0gQVtpXS53dDsKICAgIH0KICAgIGNvdXQgPDwgZW5kbDsKICAgIGNvdXQgPDwgIkF2ZXJhZ2UgV2FpdGluZyBUaW1lIDogIiA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oMikgPDwgIHRvdGFsIC8gbiA8PCBlbmRsOwp9CgppbnQgbWFpbigpewogICAgaW50IG47IGNpbiA+PiBuOwoKICAgIHZlY3RvcjxUPnQobik7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKXsKICAgICAgICBzdHJpbmcgcHJvOyBjaW4gPj4gcHJvOwogICAgICAgIGludCBiYXMsIHByaSwgYXJpOyBjaW4gPj4gYmFzID4+IHByaSA+PiBhcmk7CgogICAgICAgIHRbaV0gPSBUKHBybywgYmFzLCBwcmksIGFyaSk7CiAgICB9CgogICAgbWVyZ2VTb3J0KHQsIDAsIG4tMSk7IAoKICAgIHZlY3RvcjxzdHJpbmc+YW5zID0gRG9Xb3JrKHQsIG4pOwogICAgc2hvd0dhbnR0Q2hhcnQoYW5zKTsKCiAgICBjYWxjdWxhdGVXaXRpbmdUaW1lKHQsIGFucyk7CiAgICBzaG93V2FpdGluZ1RpbWUodCwgbik7CiAgICAKcmV0dXJuIDA7IAp9