您的位置:首页 > 其它

j计蒜客 2018 蓝桥杯省赛 B 组模拟赛(五) G. :合并数字【stack】

2018-03-25 21:43 344 查看

合并数字

蒜头君得到了 nn 个数,他想对这些数进行下面这样的操作,选出最左边的相邻的差的绝对值为 11 的两个数,只保留较小的数,删去较大的数,直到没有两个相邻的差的绝对值为 11 的数,问最多可以进行多少次这样的操作?

输入格式

输入第一行为一个整数 n(1 \leq n \leq 10^5)n(1≤n≤10

5

),表示数字的总数

第二行为 nn 个整数 x_1,x_2,…,x_n(0 \leq x_i \leq 10^9)x

1

​ ,x

2

​ ,…,x

n

​ (0≤x

i

​ ≤10

9

),表示这些数。

输出格式

输出一行,为一个整数,表示蒜头君最多可以进行多少次这样的操作。

样例输入

4

1 2 0 1

样例输出

3

题意: 略

分析: 我们用个栈来维护即可,坑的地方就是如果新插入的点比栈顶元素小一,我们要把栈顶元素出栈,然后继续和栈顶元素来比较,比赛的时候就这漏了,然后就没得分

参考代码

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 +10;

int a[maxn];

int main() {
int n;cin>>n;
for (int i = 0; i < n; i++) {
cin>>a[i];
}
stack<int> s;
for (int i = 0; i < n; i++) {
if(!s.size()) {
s.push(a[i]);
} else {
if(abs(a[i] - s.top()) != 1) s.push(a[i]);
else if(s.top() - a[i] == 1) {
s.pop();
bool flg = false;
while (s.size() > 0 && abs(a[i] - s.top()) == 1) {
if(s.top() - a[i] == 1) {
s.pop();
} else {
flg = true;
break;
}
}
if(!flg)
s.push(a[i]);
}
}
}
cout<<n - s.size()<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: