循环队列,其实是一种很简单的数据结构,这里用AIZU题目的代码直接带过。
注意:取余的下标可能为负,当时我不知道,以为是在0-man_n-1的区间,其实不然,导致出现了错误。
注意:函数内使用cout的endl不当,程序可能会报错。(‘\n’来代替,就可以避免这个问题,这个endl不只是一个换行而已)
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int max_n=100000+2;
int n,q;
typedef struct Queue_node
{
char str[12];
int time;
}Queue_node;
Queue_node Queue[max_n];
int head,tail;
void init()
{
head=1;
tail=1;
}
void enqueue(Queue_node x)
{
Queue[tail]=x;
tail=(tail+1)%max_n;
//cout<<(Queue[tail-1].time)<<'\n';
}
Queue_node dequeue(void)
{
head=(head+1)%max_n;
return Queue[(head-1+max_n)%max_n];
}
bool isEmpty(void)
{
return head==tail;
}
int main()
{
scanf("%d %d",&n,&q);
init();
for(int i=0;i<n;++i)
{
Queue_node a;
scanf("%s %d",&a.str,&a.time);
enqueue(a);
//cout<<Queue[tail-1].time<<endl;
//cout<<a.time<<endl;
}
int ans=0;
while(!isEmpty())
{
Queue_node x=dequeue();
if(x.time<=q)
{
ans+=x.time;
printf("%s %d\n",x.str,ans);
}
else
{
ans+=q;
x.time-=q;
enqueue(x);
}
}
return 0;
}