您的位置:首页 > 其它

CF-Codeforces Round #420 (Div. 2)-C-Okabe and Boxes

2017-06-27 20:34 453 查看
ACM模版

描述



题解

这个是模拟栈的操作,不过有稍微不同的是,题目希望按顺序 pop() 1∼n, 如果出现无法按顺序,那么就可以对栈内元素进行一个排序,所以呢,最后结果是求最少需要排序的次数。

这里有一个很强的条件,就是不会出现不合法的情况,也就是说,当我们该输出 x 时,栈内一定会有 x,所以呢,原本我们需要暴力解一下,每次遇见不合法就排序,现在可以直接清空,当我们 pop() 时,如果栈内为空,默认此时一定是可以弹出想要的值的,不过我们提前弹出了,所以这里直接 O(n) 可解了。使用 <
vector
> 向量比较好写一些。

代码

#include <cstdio>
#include <iostream>
#include <vector>

using namespace std;

char str[7];
vector<int> vi;

int n;

int main()
{
scanf("%d", &n);

int cnt = 1, ans = 0, x;
for (int i = 1; i <= 2 * n; i++)
{
scanf("%s", str);
if (str[0] == 'a')
{
scanf("%d", &x);
vi.push_back(x);
}
else
{
if (vi.empty()) ;
else if (vi.back() == cnt)
{
vi.pop_back();
}
else
{
ans++;
vi.clear();
}
cnt++;
}
}

cout << ans << endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  模拟 STL