1. 程式人生 > >Freda的佇列 簡單模擬

Freda的佇列 簡單模擬

Freda的佇列

Problem Description
Freda有一個佇列,最初它是空的。
現在Freda接到了一系列指令,每個指令包含一個整數x。
如果x>0,表示在佇列開頭加入一個數x。
如果x=0,表示把佇列複製一份,並接在現有佇列的末尾。
如果x=-1,表示彈出佇列頭部的數,並輸出這個數值。
但是指令實在是太多了,Freda實在是計算不過來每次要輸出什麼數值,請你幫幫她吧。
Input
第一行包含一個整數N,表示指令的個數。
接下來N行每行一個整數x,描述每條指令。
Output
對於每條x=-1的指令,若此時佇列不為空,則輸出一個整數,表示從隊頭彈出的數。否則不進行任何操作。
Sample Input
8
3
4
0
-1
-1
-1
-1
1
Sample Output
4
3
4
3
Tip
對於50%的資料,1≤N≤1000
對於100%的資料,1≤N≤106

,-1≤x≤109

觀察此題,我們可以知道,這是一道簡單的模擬題,題目要求我們建出一個佇列,並且包含向後複製這個佇列,向前插入數,輸出並刪除第一個數這三個操作。
那麼,我們就可以直接模擬出這道題的情況。
但是,我們考慮到,如果題目不斷的複製後面的佇列,將會導致我們所需要的時間過長。
所以,我們認真觀察資料,發現N的範圍在[1,106]內,那麼,也就是說,最壞的情況,題目要求我們一直輸出,也只能輸出106個數。所以,我們的佇列如果長度超過106,那麼,後面的部分都可以捨棄,不需要再向後新增數。所以,我們得到如下的程式碼。

#include <cstdio>
 
using namespace std;
 
const int maxn=1000050;
int x[maxn<<1];
int head=maxn+1,tail=maxn;
int n,a;
 
inline int read()
{
    int f=0,x=0;char c=getchar();
    while (((c<'0')||(c>'9'))&&(c!='-'))
        c=getchar();
    if (c=='-')
        c=getchar(),f=1;
    while ((c>='0')&&(c<='9'))
        x=(x<<3)+(x<<1)+c-'0',c=getchar();
    return f?-x:x;
}
 
int main()
{
    n=read();
    while (n--)
    {
        a=read();
        switch (a)
        {
            case -1:
                if (head<=tail)
                    printf("%d\n",x[head++]);
                break;
            case 0:
                for (int t=tail,q=head;((tail-1)<=(maxn<<1))&&(tail-head+51<=maxn)&&q<=t;q++)
                    x[++tail]=x[q];
                break;
            default:
                x[--head]=a;
        }
    }
    return 0;
}