计蒜客 蓝桥杯模拟五 合并数字

蒜头君希望对数列进行操作,每次选择相邻且差的绝对值为1的两个数,删除较大数,直至无法继续。使用栈简化算法,实现最大次数的计算。

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

输入格式

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

第二行为 nn 个整数 x_1,x_2,...,x_n(0 \leq x_i \leq 10^9)x1,x2,...,xn(0xi109),表示这些数。

输出格式

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

样例输入
4
1 2 0 1
样例输出
3
用stack使结果简化很多
 1 #include<iostream>
 2 #include<stack>
 3 using namespace std;
 4 int main()
 5 {
 6     stack <int> a;
 7     int sum = 0;
 8     int n,temp;
 9     cin >> n;
10     for (int i = 0; i < n; i++)
11     {
12         cin >> temp;
13         while (!a.empty() && a.top() - temp == 1)
14         {
15             a.pop();
16             sum++;
17         }
18         if (!a.empty() && temp - a.top() == 1) sum++;
19         else a.push(temp);
20     }
21     cout << sum << endl;
22     return 0;
23 }

注:此为大佬的题解改良

转载于:https://www.cnblogs.com/kangdong/p/8660594.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值