###合并数字
蒜头君得到了 n个数,他想对这些数进行下面这样的操作,选出最左边的相邻的差的绝对值为 1的两个数,只保留较小的数,删去较大的数,直到没有两个相邻的差的绝对值为 1 的数,问最多可以进行多少次这样的操作?
输入格式
输入第一行为一个整数 n ( 1 ≤ n ≤ 1 0 5 ) n(1 \leq n \leq 10^5) n(1≤n≤105),表示数字的总数
第二行为 n 个整数 x 1 , x 2 , . . . , x n ( 0 ≤ x i ≤ 1 0 9 ) x_1,x_2,...,x_n(0 \leq x_i \leq 10^9) x1,x2,...,xn(0≤xi≤109),表示这些数。
输出格式
输出一行,为一个整数,表示蒜头君最多可以进行多少次这样的操作。
样例输入
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;
}