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; }
相关文章推荐
- 【计蒜客】2018 蓝桥杯省赛 B 组模拟赛(五) ---- 程序设计:合并数字
- 2018 蓝桥杯省赛 B 组模拟赛(五)合并数字(转)
- 2018 蓝桥杯省赛 B 组模拟赛(五) G. 程序设计:合并数字
- 2018 蓝桥杯省赛 B 组模拟赛(五) G. 程序设计:合并数字
- 2018 蓝桥杯省赛 B 组模拟赛(五)合并数字(转)
- 计蒜客 2018 蓝桥杯省赛 B 组模拟赛(五) G. 程序设计:合并数字
- 2018 蓝桥杯省赛 B 组模拟赛(一)-U型数字
- 计蒜客 2018 蓝桥杯省赛 B 组模拟赛(一)-C. 结果填空:U型数字
- 2018 蓝桥杯省赛 B 组模拟赛(一) U型数字
- 2018 蓝桥杯省赛 B 组模拟赛(一)-U型数字
- 2018 蓝桥杯省赛 B 组模拟赛(一)----U型数字
- 2018 蓝桥杯省赛 B 组模拟赛(一)G. 数列求值
- 2018 蓝桥杯省赛 B 组模拟赛(五)
- 2018第五次蓝桥杯模拟--划分数字
- 2018 蓝桥杯省赛 B 组模拟赛(五)整数划分
- 2018 蓝桥杯省赛 B 组模拟赛(一)I. 天上的星星
- 2018 蓝桥杯省赛 B 组模拟赛(五)素数个数
- 2018 蓝桥杯省赛 B 组模拟赛(五)末尾零的个数
- 2018 蓝桥杯省赛 B 组模拟赛(五)J. 程序设计:划分整数
- 2018 蓝桥杯省赛 B 组模拟赛(一)--- H. 封印之门