队列(裸题)

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);
    }
  }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值