CF420 div2 821C Okabe and Boxes

題意:
給你2*n個操作,分別是在棧頂部加一個數,刪除棧頂的一個數,刪除的順序是1到n,你可以在任何一次操作後對棧中序列進行重排,問你最小需要多少次重排。
題解:
扯一下犢子,看到這玩意一下子想到棧,但是我想用兩個變量去做,結果發現失敗了。。。回到了棧發現是真的簡單,MD。。還有就是不會發生以下情況,4,2,1,刪除三次,導致出現124這種不對的情況,題目的數據是不會出現這種情況的,放心好了,下面說一下做法。
如果是add就放到棧頂,然後是remove的話就判斷當前棧頂的值與要被刪除的值比較是否相同,如果相同就移除棧頂的值,如果不相同就清空棧,就相當於重排了一遍並計數就可以過了,具體的內容看代碼。

#include<stdio.h>
#include<stack>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int a,b=0,ans=0;
        char s[10];
        stack<int>st;
        for(int i=1;i<=2*n;i++)
        {
            scanf("%s",s);
            if(s[0]=='a'){
                scanf("%d",&a);
                st.push(a);
            }
            else
            {
                b++;
                if(!st.empty()&&st.top()==b)
                st.pop();
                else
                {
                    if(!st.empty())
                    ans++;
                    while(!st.empty())
                    st.pop();
                }
            }
        }
        printf("%d\n",ans);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章