蒜头君得到了 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,次数++
否则,添加新元素
#include<iostream>
#include<stack>
#include<cstdio>
using namespace std;
int main(){
int n;
cin>>n;
stack<int> sta;
int cnt=0;
for(int i=0;i<n;i++){
int num;
scanf("%d",&num);
if(sta.size()==0){
sta.push(num);
}
else if(num-sta.top()==1){
cnt++;
continue;
}
else if(sta.top()-num==1){
sta.pop();
cnt++;
while(sta.size()){
if(sta.top()-num==1){
cnt++;
sta.pop();
}
else if(num-sta.top()==1){
cnt++;
break;
}
else{
sta.push(num);
break;
}
}
if(sta.size()==0) sta.push(num);
}
else sta.push(num);
}
cout<<cnt;
return 0;
}
欢迎大家加入 早起学习群,一起学习一起进步!(群号:642179511)