队列中有 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≤106
题目分析:本题还是比较简单的,只要理解题意并且结合队列的性质就能够比较轻松的解决
AC代码:
#include<iostream>
#include<queue>
#include<cstdio>
#include<cmath>
#include<stack>
#include<algorithm>
using namespace std;
int main()
{
int n,q;
cin>>n>>q;
//用一个time来记录每一次的时间点
int time=0;
//pi和时间分别用两个栈来存储
queue<int> s;
queue<string> d;
string a;
int b;
for(int i=0;i<n;i++)
{
cin>>a>>b;
s.push(b);
d.push(a);
}
while(!s.empty())
{
//第一种情况是在一次是q时间内不能够执行完
if(s.front()>q)
{
//那么s栈就要更改所剩的时间了
s.push(s.front()-q);
s.pop();
time+=q;
//那么d栈就需要把编号移到最后并且将原先的编号出栈
d.push(d.front());
d.pop();
}
else
{
//如果一次时间就能够执行完毕的,直接打印即可
time+=s.front();
cout<<d.front()<<" "<<time<<endl;
//然后将元素出栈就行
s.pop();
d.pop();
}
}
system("pause");
return 0;
}