题目描述如下:
题目大意是把n个箱子模拟入栈和出栈,并且要求出栈顺序必须按照从1——n的顺序,否则任意重排栈内的箱子顺序,最后求n个箱子出栈所需的重排的最少次数。
本题的问题规模比较大,如果用暴力解法(对栈的所有元素进行排序)的话,会超时。
所以本题解题的关键在与题目中的两句话,出栈顺序必须按照从1——n的顺序和在箱子出栈前箱子已经入栈了。
前一句说明能否出栈只需要看关注栈顶元素即可,若栈顶的箱子是要出栈的箱子,则出栈,否则重排,又因为要出栈的箱子肯定在栈内,所以重排后肯定可以进行出栈操作。所以不需要考虑后面的箱子的顺序。
代码如下:
#include <iostream>
#include <string>
#define N 300000
using namespace std;
int main() {
int n, len = 0, ans = 0, temp = 1;
int a[N];
string s;
cin >> n;
for(int i = 0; i < 2*n; i++) {
cin >> s;
if (s == "add") {
cin >> a[len++];
}
else {
if (len!=0){
if (a[len-1] != temp) {
len=0; //重排后,非栈顶元素已经按最佳顺序排行,所以不需考虑
ans++;
}else {
len--;
}
temp++;
} else { // 当连续多次remove时,只需要在第一次进行重排即可
temp++;
}
}
}
cout << ans << endl;
return 0;
}