操作系统_处理器管理_编程题
作业调度算法–短作业优先
输入N个作业,输入每个的作业名字,到达的时间,服务的时间,根据短作业优先算法,计算出每个作业的完成的时间,周转的时间,带权周转的时间(其中保留2位小数)。
输入的格式:
第1行输入作业的数目,第2行输入作业名字,第3行输入到达的时间,第4行输入服务的时间。
输出的格式:
根据到达的时间由小到大排序,第1行输出作业名字,第2行输出到达的时间,第3行输出服务的时间,第4行输出完成的时间,第5行输出完成的时间,第6行输出带权周转的时间。
输入的样例:
给出了1组输出。如下:
5
A B C D E
0 1 2 3 4
4 3 1 2 4
输出的样例:
给出了相应输出。如下:
作 业 名:A B C D E
到达时间:0 1 2 3 4
服务时间:4 3 1 2 4
完成时间:4 10 5 7 14
周转时间:4 9 3 4 10
带权周转时间:1.00 3.00 3.00 2.00 2.50
代码
#include <bits/stdc++.h>
using namespace std;
struct process{
char name[16];
double C_T;
double R_T;
double F_T;
double cir_T;
double W_C;
int finished;
}Process[1024];
int n;
void Input(){
cin>>n;
for(int i=0;i<n;i++){
cin>>Process[i].name;
Process[i].finished = 0;
}
for(int i=0;i<n;i++){
cin>>Process[i].C_T;
}
for(int i=0;i<n;i++){
cin>>Process[i].R_T;
}
}
//输出
void Output(){
printf("作 业 名:");
for(int i=0;i<n;i++){
cout<<Process[i].name;
if(i<n-1){
printf(" ");
}
}
printf("\n");
printf("到达时间:");
for(int i=0;i<n;i++){
cout<<Process[i].C_T;
if(i<n-1){
printf(" ");
}
}
printf("\n");
printf("服务时间:");
for(int i=0;i<n;i++){
cout<<Process[i].R_T;
if(i<n-1){
printf(" ");
}
}
printf("\n");
printf("完成时间:");
for(int i=0;i<n;i++){
cout<<Process[i].F_T;
if(i<n-1){
printf(" ");
}
}
printf("\n");
printf("周转时间:");
for(int i=0;i<n;i++){
cout<<Process[i].cir_T;
if(i<n-1){
printf(" ");
}
}
printf("\n");
printf("带权周转时间:");
for(int i=0;i<n;i++){
printf("%.2f",Process[i].W_C);
if(i < n-1) {
printf(" ");
}
}
}
bool cmp(process p1,process p2){
return p1.C_T<p2.C_T;
}
int main(){
Input();
sort(Process,Process+n,cmp);
int finished_count = 0;
int unfinish_pos = 0;
double now_time;
while(finished_count<n){
if(now_time<Process[unfinish_pos].C_T){
now_time = Process[unfinish_pos].C_T;
}
double min_R_T = INT_MAX;
int pos = 0;
for(int i = unfinish_pos;(i < n && now_time >= Process[i].C_T);i++){
if(Process[i].finished == 1) continue ;
if(Process[i].R_T < min_R_T){
min_R_T = Process[i].R_T;
pos = i;
}
}
{
now_time += Process[pos].R_T;
Process[pos].F_T = now_time;
Process[pos].cir_T = now_time - Process[pos].C_T;
Process[pos].W_C = Process[pos].cir_T / Process[pos].R_T;
Process[pos].finished = 1;
if(pos == unfinish_pos){
unfinish_pos = pos + 1;
}
finished_count++;
}
}
Output();
return 0;
}