#include "iostream"
#include "algorithm"
#include "math.h"
#define max(a, b) a > b ? a : b;
using namespace std;
struct JB
{
int r; //提出请求时间
int d; //服务时间
float s; //开始服务时间
float f; //完成服务时间
};
JB jb[100];
bool cmp(JB &jb1, JB &jb2)
{
if(jb1.d < jb2.d)
return true;
else if(jb1.d == jb2.d)
return jb1.r < jb2.r;
else
return false;
}
void swap(JB &jb1, JB &jb2)
{
JB tmp = jb1;
jb1 = jb2;
jb2 = tmp;
}
//n表示请求数
float waitingTimeSJF(int requestTimes[], int durations[], int n)
{
int i;
for(i=0; i<n; i++)
{
jb[i].r = requestTimes[i];
jb[i].d = durations[i];
}
sort(jb+1, jb+n, cmp);
float sum = 0;
for(i=0; i<n; i++)
{
if(i == 0)
{
jb[i].s = jb[i].r;
jb[i].f = jb[i].r + jb[i].d;
}
else
{
if(jb[i].r <= jb[i-1].f) //如果提出请求的时间比上一个任务完成的时间早
{
jb[i].s = jb[i-1].f;
jb[i].f = jb[i].s + jb[i].d;
}
else //上个任务已经完成,为了使机器不停歇,找一个提出请求时间早且持续时间短的任务
{
int j = i + 1;
while(jb[j].r > jb[i-1].f)
j++;
swap(jb[i], jb[j]); //与当前的任务交换一下顺序
jb[i].s = jb[i-1].f;
jb[i].f = jb[i].s + jb[i].d;
}
}
}
for(i=0; i<n; i++)
{
sum += jb[i].s - jb[i].r;
}
return sum / (float)n;
}
int main()
{
//int r[] = {0, 1, 3, 9};
//int d[] = {2, 1, 7, 5};
int r[] = {0, 2, 4, 5};
int d[] = {7, 4, 1, 4};
float tt = waitingTimeSJF(r, d, 4);
cout << tt << endl;
return 0;
}