題意:
給你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);
}
}