http://codeforces.com/contest/821/problem/C
题意:有已知的2*n条命令,分别是往栈里放一个数,或从栈顶拿出一个数并排起来,要求排的顺序必须是严格从1到n
在任何时候你可以重新改变栈内元素的位置,求最少改变几次使得出栈的数排的顺序是严格从1到n的
保证有解
暴力思想:模拟栈操作,当出的元素不是当前要求的,则对栈内元素重新排序,必然会t
优化是把排序操作改为清空栈,当出元素时,若栈为空,则按出栈正确处理
因为排序后,栈内这些元素出栈顺序必然是符合要求的,不需要在重新排序
还有一种情况:排序后,栈内元素不全部出栈,在入栈一个或多个元素,再出,这个时候就看当前栈顶元素是否是目前应该出栈的元素,是则直接出栈,如果不是则需要重新排序(也就是栈清空),会发现清空栈并不影响结果,这样时间也就允许了。
#include<bits/stdc++.h>
#define eps 1e-9
#define PI 3.141592653589793
#define bs 1000000007
#define bsize 256
#define MEM(a) memset(a,0,sizeof(a))
typedef long long ll;
using namespace std;
stack<int>s;
int main()
{
int n,i,d,ans=0,cnt=1;
char ch[10];
cin>>n;
for(i=0;i<2*n;i++)
{
scanf("%s",ch);
if(ch[0]=='a')
{
scanf("%d",&d);
getchar();
s.push(d);
}
else
{
if(!s.empty())
{
int now=s.top();
s.pop();
if(cnt!=now)
{
while(!s.empty())
s.pop();
ans++;
}
}
cnt++;
}
}
cout<<ans<<endl;
return 0;
}