#include<iostream>
using namespace std;
static const int MaxNum=100;
int ArrivalTime[MaxNum];
int ServiceTime[MaxNum];
int FinishTime[MaxNum];
int WholeTime[MaxNum];//周转时间;
double WeightWholeTime[MaxNum];//带权周转时间
int visit[MaxNum]={0};
int n;
void creat(){
for(int i=0;i<n;i++)
{FinishTime[i]=0,
WholeTime[i]=0,
WeightWholeTime[i]=0;}
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
void FCFS(){
int beginTime[MaxNum];//进程开始时间;
beginTime[0]=ArrivalTime[0];
FinishTime[0]= beginTime[0]+ServiceTime[0];
//计算第i个进程完成时间
for(int i=1;i<n;i++)
{
if(ArrivalTime[i]<(beginTime[i-1]+ServiceTime[i-1]))
beginTime[i]=beginTime[i-1]+ServiceTime[i-1];
//提前到达,等待前面完成
else
beginTime[i]=ArrivalTime[i];
//后到达,处理机等待;
FinishTime[i]=beginTime[i]+ServiceTime[i];
//计算第i个进程完成的时间
}
//求周转时间;
for(i=0;i<n;i++)
{
WholeTime[i]=FinishTime[i]- ArrivalTime[i];
//周转时间=完成时间-到达时间;
}
//求带权周转时间
for(i=0;i<n;i++)
{
WeightWholeTime[i]=WholeTime[i]/(ServiceTime[i]*1.0);
}
}
double AverageWT_FCFS(){
//FCFS平均周转时间
double sum=0;
for(int i=0;i<n;i++)
{
sum+=WholeTime[i];
}
return sum/(n*1.0);
}
double AverageWWT_FCFS(){
//FCFS平均带权周转时间
double sum=0;
for(int i=0;i<n;i++)
{
sum+=WeightWholeTime[i];
}
return sum/(n*1.0);
}
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
int cmp(int use_Time){
//use_Time表示现在系统已经操作多少时间了
int x;//x表示下一个要执行的进程;
for(int i=0;i<n;i++)
{
if(visit[i]==0)
{x=i;break;}
}
x=i;
for( i=0;i<n;i++)
{
if(visit[i]==1)continue;
if(use_Time>=ArrivalTime[i] && ServiceTime[i]<ServiceTime[x])
x=i;
}
//cout<<"x==="<<x<<endl;
return x;
}
void SJF(){
int beginTime[MaxNum];//进程开始时间;
beginTime[0]=ArrivalTime[0];
FinishTime[0]= beginTime[0]+ServiceTime[0];
int pre=0;//完成的进程下标;
visit[0]=1;
for(int j=1;j<n;j++)
{
int i=cmp(FinishTime[pre]);
if(ArrivalTime[i]<(beginTime[pre]+ServiceTime[pre]))
beginTime[i]=beginTime[pre]+ServiceTime[pre];
//提前到达,等待前面完成
else
beginTime[i]=ArrivalTime[i];
//后到达,处理机等待;
FinishTime[i]=beginTime[i]+ServiceTime[i];
//计算第i个进程完成的时间
visit[i]=1;//标记已经访问过了;
pre=i;
}
//求周转时间;
for(int i=0;i<n;i++)
{
WholeTime[i]=FinishTime[i]- ArrivalTime[i];
//周转时间=完成时间-到达时间;
}
//求带权周转时间
for(i=0;i<n;i++)
{
WeightWholeTime[i]=WholeTime[i]/(ServiceTime[i]*1.0);
}
}
double AverageWT_SJF(){
//SJF平均周转时间
double sum=0;
for(int i=0;i<n;i++)
{
sum+=WholeTime[i];
}
return sum/(n*1.0);
}
double AverageWWT_SJF(){
//SJF平均带权周转时间
double sum=0;
for(int i=0;i<n;i++)
{
sum+=WeightWholeTime[i];
}
return sum/(n*1.0);
}
void main(){
freopen("text.txt","rt",stdin);
int i=0;
//cout<<"请输入进程个数"<<endl;
cin>>n;
// cout<<"进程到达系统时刻分别为"<<endl;
for(i=0;i<n;cin>>ArrivalTime[i++]);
// cout<<"进程需要服务时间分别为:"<<endl;
for(i=0;i<n;cin>>ServiceTime[i++]);
FCFS();
cout<<"FCFS平均周转时间"<<AverageWT_FCFS()<<endl;
cout<<"FCFS平均带权周转时间"<<AverageWWT_FCFS()<<endl;
creat();
SJF();
cout<<"SJF平均周转时间"<<AverageWT_SJF()<<endl;
cout<<"SJF平均带权周转时间"<<AverageWWT_SJF()<<endl;
}