2022.10.13(23:46)写完就睡太困了。
任务描述
本关任务:编写一个模拟CPU处理任务的循环调度法的程序。
本关要求您设计一个队列或者使用C++ STL的队列容器(queue)完成给定任务(见后面的编程要求)。
相关知识
为了完成本关任务,你需要掌握:1.如何设计和实现一个队列,2.如何使用C++ STL的队列容器queue。(DDD)
编程要求
现有名称为name i且处理时间为time i的n个任务按顺序排成一列,CPU通过循环调度法逐一处理这些任务,每个任务最多处理q ms (这个时间称为时间片)。如果q ms 之后任务尚未处理完毕,那么该任务将被移动至队列最末尾,CPU随即开始处理下一个任务。
举个例子,假设q是100,然后有如下任务队列。
A(150) - B(80) - C(200) - D(200)
首先A被处理100 ms,然后带着剩余的50 ms移动至队尾。
B(80) - C(200) - D(200) - A(50)
随后B被处理80 ms,在总计第180 ms时完成处理,从队列中消失。
C(200) - D(200) - A(50)
接下来C被处理100 ms,然后带着剩余的100 ms移动至队尾。
D(200) - A(50) - C(100)
之后同理,一直循环到处理完所有任务。
请编写一个程序,模拟CPU循环调度法。
输入:
输出:
按照任务完成的先后顺序输出各任务名以及结束时间,任务名与对应结束时间用空格隔开,每一对任务名与结束时间占1行。
限制:
输入示例:
输出示例:
开始你的任务吧,祝你成功!
C++代码
#include <bits/stdc++.h>
using namespace std;
//队列最大容量
#define maxSize 100005
typedef struct MISSION{
char name[100];
int t;
}P;
P Q[maxSize];
int head, tail, n;
void enqueue(P x) {
Q[tail] = x;
tail = (tail + 1) % maxSize;
}
P dequeue() {
P x = Q[head];
head = (head + 1) % maxSize;
return x;
}
int min(int a, int b) {
return a < b ? a : b;
}
int main() {
int elaps = 0, c;
int i, q;
P u;
scanf("%d %d", &n, &q);
for (i = 1; i <= n; i++) {
scanf("%s", Q[i].name);
scanf("%d", &Q[i].t);
}
head = 1; tail = n + 1;
while (head != tail) {
u = dequeue();
c = min(q, u.t);
u.t -= c;
elaps += c;
if (u.t > 0) enqueue(u);
else {
printf("%s %d\n", u.name, elaps);
}
}
return 0;
}