简单实现队列
题目:现有名称为namei且处理时间为timei的n个任务按顺序排成一列,CPU通过循环调度法逐一处理这些任务,每个任务最多处理q ms(这个时间被称为时间片)。如果q ms之后任务尚未处理完毕,那么该任务将被移动至队伍末尾,CPU随即开始处理下一个任务。
输入:
n q
name1 time1
name2 time2
…
namen timen
第一行输入表示任务数的整数n与表示时间片的整数q,用一个空格隔开。
接下来行输入各任务的信息。字符串namei
与timei用一个空格隔开。
输出:
按照任务完成的先后顺序输出各任务名以及结束的时间,任务名与对应结束的时间用空格隔开,每一对任务名与结束时间各占一行。
输入示例
5 100
p1 150
p2 80
p3 200
p4 350
p5 20
输出示例
p2 80
p5 400
p1 450
p3 550
p4 800
代码:
#include "stdafx.h"
#include<iostream>
#include<algorithm>
using namespace std;
#define LEN 100005
struct A{
char name[100];
int t;
};
int n,head,tail;
A Q[LEN],u;
A dequeue(){
A s=Q[head];
head=(head+1)%LEN;
return s;
}
void enqueue (A x){
Q[tail]=x;
tail=(tail+1)%LEN;
}
int main(){
int q,i,c,time=0;
cin>>n>>q;
for(i=1;i<=n;i++)
{
cin>>Q[i].name>>Q[i].t;
}
head=1;
tail=n+1;
while(head!=tail)//其实最开始时tail和head就是在一起的,但是前两行代码避开了这个问题
//因此最终head就等于tail了,所以就能出来了
{
u=dequeue();
c=min(u.t,q);
time=time+c;
u.t=u.t-c;
if(u.t>0){
enqueue(u);
}
else cout<<u.name<<" "<<time<<endl;
}
}
到此结束