队列中有 n 个进程。 每个进程都有namei和timei。 循环调度按顺序处理进程。 循环调度程序为每个进程提供一个时间段(一个时隙),如果到那时它没有完成,则中断该进程。 进程被恢复并移动到队列的末尾,然后调度程序处理队列中的下一个进程。 例如,我们有以下队列,时间段长度为 100 毫秒。A(150) - B(80) - C(200) - D(200)
首先,进程 A 被处理 100 毫秒,然后进程移动到队列末尾,剩余时间(50 毫秒)。B(80) - C(200) - D(200) - A(50)
接下来,进程B被处理80ms。 该过程以 180ms 的时间戳完成并从队列中移除。目前队列为C(200) - D(200) - A(50)
你的任务是编写一个模拟循环调度的程序。
输入
n q
name_1 time_1
name_2 time_2
...
name_n time_n
在第一行中,进程数 n 和时隙 q 由单个空格分隔。
在接下来的 n 行中,给出了 n 个进程的名称和时间。namei 和 timei 由一个空格分隔。
输出
对于每个进程,按顺序打印其名称和进程完成的时间。
约束
1≤n≤100000
1≤q≤1000
1≤timei≤50000
1≤len{namei}≤10
1≤∑timei≤10^6
输入样例
5 100
p1 150
p2 80
p3 200
p4 350
p5 20
输出样例
p2 180
p5 400
p1 450
p3 550
p4 800
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Process {
char name[11];
int time;
struct Process* next;
} Process;
typedef struct Queue {
Process* front;
Process* rear;
} Queue;
Queue* createQueue() {
Queue* queue = (Queue*)malloc(sizeof(Queue));
queue->front = NULL;
queue->rear = NULL;
return queue;
}
int isEmpty(Queue* queue) {
return queue->front == NULL;
}
void enqueue(Queue* queue, Process process) {
Process* newProcess = (Process*)malloc(sizeof(Process));
*newProcess = process;
newProcess->next = NULL;
if (isEmpty(queue)) {
queue->front = newProcess;
queue->rear = newProcess;
} else {
queue->rear->next = newProcess;
queue->rear = newProcess;
}
}
Process dequeue(Queue* queue) {
if (isEmpty(queue)) {
fprintf(stderr, "Queue is empty\n");
exit(EXIT_FAILURE);
}
Process process = *queue->front;
Process* temp = queue->front;
queue->front = queue->front->next;
free(temp);
return process;
}
int main()
{
int n;
Queue* queue = createQueue();
int q;
scanf("%d %d",&n,&q);
for(int i=0;i<n;i++)
{
Process process;
scanf("%s %d", process.name, &process.time);
enqueue(queue, process);
}
int t=0;
while(!isEmpty(queue))
{
Process current=dequeue(queue);
if(current.time>0)
{
int g=(current.time>q?q:current.time);
t+=g;
current.time-=g;
if(current.time==0)
{
printf("%s %d\n",current.name,t);
}
else
{
enqueue(queue,current);
}
}
}
free(queue);
return 0;
}