蒜头君得到了 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; }