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

###合并数字

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

输入格式

输入第一行为一个整数 n ( 1 ≤ n ≤ 1 0 5 ) n(1 \leq n \leq 10^5) n(1n105),表示数字的总数

第二行为 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(0xi109),表示这些数。

输出格式

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

样例输入

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值