Queue Aizu - ALDS1_3_B
For example, we have the following queue with the quantum of 100ms.
A(150) - B(80) - C(200) - D(200)
First, process A is handled for 100ms, then the process is moved to the end of the queue with the remaining time (50ms).
B(80) - C(200) - D(200) - A(50)
Next, process B is handled for 80ms. The process is completed with the time stamp of 180ms and removed from the queue.
C(200) - D(200) - A(50)
Your task is to write a program which simulates the round-robin scheduling .
Input
n q
name1 time1
name2 time2
...
namen timen
In the first line the number of processes n and the quantum q are given separated by a single space.
In the following n lines, names and times for the n processes are given. namei and timei are separated by a single space.
Output
For each process, prints its name and the time the process finished in order.
Constraints
- 1 ≤ n ≤ 100000
- 1 ≤ q ≤ 1000
- 1 ≤ timei ≤ 50000
- 1 ≤ length of namei ≤ 10
- 1 ≤ Sum of timei ≤ 1000000
Sample Input 1
5 100 p1 150 p2 80 p3 200 p4 350 p5 20
Sample Output 1
p2 180 p5 400 p1 450 p3 550 p4 800
Notes
Template in C
题目也是一个很裸的队列,就是支持插入和删除的操作,只不过做成了环,减少了极大的空间花费。同样数组模拟队列。做成环的环的话要注意取模问题。
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 100000 + 5;
struct node{
char my_name[10];
int my_time;
};
int n,q;
int head,tail;
int q_time = 0;
node que[maxn];
void push_back(node& k){
que[tail++] = k;
tail %= (n+5);
}
node pop_front(){
node k = que[head++];
head %= (n+5);
return k;
}
int main(){
scanf("%d%d",&n,&q);
head = 0;
tail = 0;
for(int i = 1;i <= n; i++){
node Q;
scanf("%s%d",Q.my_name,&Q.my_time);
push_back(Q);
}
while(head != tail){
node k = pop_front();
if(k.my_time - q > 0){
k.my_time -= q;
push_back(k);
q_time += q;
}
else{
q_time += k.my_time;
printf("%s %d\n",k.my_name,q_time);
}
}
}