作业调度算法–高响应比优先
问题描述:
输入N(N>0)个作业,输入每个作业的名字,到达时间,服务时间,按照高响应比优先算法,计算每个作业的完成时间,周转时间,带权周转时间(保留2位小数)。
输入格式:
第一行输入作业数目,第二行输入作业的名字,第三行输入到达时间,第四行输入服务时间。
输出格式:
按照到达时间从小到大排序,第一行输出作业的名字,第二行输出到达时间,第三行输出服务时间,第四行输出完成时间,第五行输出完成时间,第六行输出带权周转时间。
输入样例:
在这里给出一组输入。例如:
5
A B C D E
0 1 2 3 4
4 3 4 2 4
输出样例:
在这里给出相应的输出。例如:
作 业 名:A B C D E
到达时间:0 1 2 3 4
服务时间:4 3 4 2 4
完成时间:4 7 13 9 17
周转时间:4 6 11 6 13
带权周转时间:1.00 2.00 2.75 3.00 3.25
代码实现(C语言):
#include<stdio.h>
#include<stdlib.h>
struct pcb
{
char name[10];
int ASD;
int DD;
int NN;
int NC;
int ww;
double wtime;
double rp;
int state;
};
void input(struct pcb* p, int n)
{
for (int i = 0; i < n; i++) {
scanf("%s", p[i].name, sizeof(p[i]));
}
for (int i = 0; i < n; i++) {
scanf("%d", &p[i].ASD);
}
for (int i = 0; i < n; i++) {
scanf("%d", &p[i].DD);
}
}
void output(struct pcb* p, int n)
{
printf("作 业 名:");
for (int i = 0; i < n; i++) {
if (i == n - 1) {
printf("%s", p[n - 1].name);
printf("\n");
}
else {
printf("%s ", p[i].name);
}
}
printf("到达时间:");
for (int i = 0; i < n; i++) {
if (i == n - 1) {
printf("%d", p[n - 1].ASD);
printf("\n");
}
else {
printf("%d ", p[i].ASD);
}
}
printf("服务时间:");
for (int i = 0; i < n; i++) {
if (i == n - 1) {
printf("%d", p[n - 1].DD);
printf("\n");
}
else {
printf("%d ", p[i].DD);
}
}
printf("完成时间:");
for (int i = 0; i < n; i++) {
if (i == n - 1) {
printf("%d", p[n - 1].NC);
printf("\n");
}
else {
printf("%d ", p[i].NC);
}
}
printf("周转时间:");
for (int i = 0; i < n; i++) {
if (i == n - 1) {
printf("%d", p[n - 1].ww);
printf("\n");
}
else {
printf("%d ", p[i].ww);
}
}
printf("带权周转时间:");
for (int i = 0; i < n; i++) {
if (i == n - 1) {
printf("%.2f", p[n - 1].wtime);
printf("\n");
}
else {
printf("%.2f ", p[i].wtime);
}
}
}
//ASD升序
void sort(struct pcb* p, int n)
{
for (int i = 0; i < n - 1; i++)
{
struct pcb temp;
for (int j = 0; j < n - i - 1; j++)
{
if (p[j].ASD > p[j + 1].ASD)
{
temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
}
}
}
}
void hrrf(struct pcb* p, int n) {
int finishedcount = 0; //记录已经完成的进程数
int unfinishedposition = 0; //记录未完成进程的位置
double nowtime = 0; //现在时间
for (int i = 0; i < n; i++) {
p[i].state = 0;
}
while (finishedcount < n) {
double max_rp = 0; //中间变量比较响应比
int next = 0; //记录下一个要运行的位置下标
for (int i = unfinishedposition; (i < n && p[i].ASD <= nowtime&&i!=0); i++) {
if (p[i].state == 1) {
continue;
}
if (p[i].rp > max_rp) {
max_rp = p[i].rp;
next = i;
}
}
if (nowtime < p[unfinishedposition].ASD * 1.0)
{
nowtime = p[unfinishedposition].ASD * 1.0;
next = unfinishedposition;
}
{
nowtime = nowtime + p[next].DD;
p[next].state = 1;
p[next].NC = nowtime;
p[next].ww = nowtime - p[next].ASD;
p[next].wtime = 1.0 * p[next].ww / p[next].DD;
for (int i = unfinishedposition; i < n; i++) {
if (p[i].state == 0) {
unfinishedposition = i;
break;
}
}
finishedcount++;
}
for (int i = 0; i < n && (p[i].ASD <= nowtime); i++) {
if (p[i].state == 1) {
continue;
}
else {
p[i].rp = (nowtime + p[i].DD-p[i].ASD) / p[i].DD;
}
}
}
}
int main()
{
int n;
scanf("%d", &n);
struct pcb p[333];
input(p, n);
sort(p, n);
hrrf(p, n);
output(p, n);
return 0;
}
写在最后:各位看到此博客的小伙伴,如有疑问或者不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!
谢谢浏览!