2018 蓝桥杯省赛 B 组模拟赛(五)合并数字

题目链接

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

输入格式

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

第二行为 nn 个整数 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

 

读错了好几次题...

维护一个栈和队列,先把第一个元素放到栈里,然后每次都判断栈首和队首的元素差值是否为1.

这里考虑到几个情况:

1.abs(队首-栈首)不等于1,那么队首入栈。

2.如果队首-栈首=1,那么队首直接出队列即可。

3.如果栈首-队首=1,将栈首出栈,队首入栈,这时候需要判断,栈首与队首的差值是否为1,回到了情况2.3,循环。否则break

#include
using namespace std;
typedef long long int LL;
const int MAXN(1e5);
const int INF(0x3f3f3f3f);
stacks;
queueq;
int main() {
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        int x;
        scanf("%d",&x);
        q.push(x);
    }
    int ans=0;
    s.push(q.front());
    q.pop();
    while(!q.empty()) {
        if(s.top()-q.front()==1) {
            s.pop();
            loops: if(!s.empty()) {
                if(q.front()-s.top()==1)
                    ans++;
                else if(s.top()-q.front()==1) {
                    s.pop();
                    ans++;
                    goto loops;
                }
                else
                    s.push(q.front());
            }
            else
                s.push(q.front());
            q.pop();
            ans++;
        }
        else if(q.front()-s.top()==1) {
            q.pop();
            ans++;
        }
        else {
            s.push(q.front());
            q.pop();
        }
    }
    cout<

 

你可能感兴趣的:(栈和队列,蓝桥杯)