与此同时,Yt正在蛋糕店给大家准备lqq的生日蛋糕。由于Yt希望给地球人都分享一块lqq的生日蛋糕,他随便写了一个循环队列来记录待处理的蛋糕订单。每个订单都用一个int记录。部分代码如下:
int a[MAX_SIZE];
int front = 0, rear = -1;
void enQueue(int x)
{
a[(++rear) % MAX_SIZE] = x;
}
int deQueue(void)
{
return a[(front++) % MAX_SIZE];
}
但是这个循环队列的稳定性真的超级糟糕。比如说,连续向a中push进了超过个数据后,循环队列里只剩下了最后push进队列的个数据。这时再输出时,队列就不能符合FIFO(先进先出)的原则了。
蛋糕的制作和发放都需要时间,所以循环队列中的输入和输出顺序是不固定的,但输入输出次数都应当与订单数相等。第一天处理了块蛋糕后,Yt发现订单记录乱糟糟的,订单顺序,以及订单的内容都不对劲。这段循环队列的代码肯定要重做了。不过在重写代码之前,Yt想确认一下订单处理系统的其他代码有没有bug。
他整理出了个长度为的数列。其中第一个数列是纸质记录下来的,今天真正的订单数据,是按正确输出顺序记录的个订单编号(也是正确FIFO时输入输出的内容)。而其余的个数列是待确认的订单记录,里面只有一些是循环队列a的输出记录。请先帮Yt分类一下:个记录之中,哪些数列不可能是循环队列a输出出来的。
此外Yt保证:
一,每次用pop输出时,a[(front++) % MAX_SIZE]
已经保存了某个数值,换言之,front%MAX_SIZE<=rear
。
二,
提示:
研究a的性质时,你会发现,在rear>=MAX_SIZE之后,a中保存的MAX_SIZE个int值,恰好是rear之前(含rear)的连续MAX_SIZE个输入值。所以对于待检测数列,只要确认每次pop时的rear值,就可以确认数列是否可以通过a得到了。这样的rear序列可能会有很多个,不过你只需要确认是否存在至少一个就可以了。