队列(裸题)

来源:互联网 发布:舞台灯光设计软件 编辑:程序博客网 时间:2024/06/09 22:48

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 100p1 150p2 80p3 200p4 350p5 20

Sample Output 1

p2 180p5 400p1 450p3 550p4 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);    }  }}



0 0
原创粉丝点击