(stack)合并数字

蒜头君得到了 n 个数,他想对这些数进行下面这样的操作,选出最左边的相邻的差的绝对值为 1 的两个数,只保留较小的数,删去较大的数,直到没有两个相邻的差的绝对值为 1 的数,问最多可以进行多少次这样的操作?
输入格式
输入第一行n 表示数字个数
第二行输入 x1,x2...xn
输出格式:
输出一行,为一个整数,表示蒜头君最多可以进行多少次这样的操作。

输入样例:
4
1  2  0  1

输出样例:
3

#include<cstdio>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<stack>
using namespace std;
int dp[150][150],s[105]; 
int n,m,k;
int ans;
bool vis[105][105];

int main(){
    stack<int> sk;
    int x;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>x;                                //将每次输入的数x和栈顶元素比较 
        while(!sk.empty()&&x==sk.top()-1){       //x比栈顶元素小1 表示栈顶元素可消去 循环消去所有比此数x大1的栈顶元素 
            sk.pop();
            ans++;
        }
        if(!sk.empty()&&x==sk.top()+1){          //x比栈顶元素大1 则此数应该被消去 
            ans++;
        }
        else{
            sk.push(x);                         //若此时 该数x 和栈顶元素不存在差1的关系 则将x入栈 
        }
        
    }
    cout<<ans;
    return 0;
}
原文地址:https://www.cnblogs.com/xusi/p/12526115.html