题目描述
给一个长度为 N 的数列,每次可以删掉这个数列中任意两个相邻的和为偶数的数。删掉之后两边的数列会合并在一起。请问进行一系列删除操作后,数列的剩余长度最短为多少。
输入
输入第一行是一个数 N,代表数列长度。
接下来一行是 N 个数,代表数列中的每个数。
对于 40% 的数据,1 <= N <= 1000。
对于 100% 的数据,1 <= N <= 100000,0 <= 数列中的数 <= 100000
输出
输出包含一个数,代表操作之后数列的最小长度。
样例输入 Copy
【样例1】 8 1 2 3 4 5 6 7 8 【样例2】 8 1 2 3 4 4 3 2 1
样例输出 Copy
【样例1】 8 【样例2】 0
提示
样例1中,一次操作都不能进行。
样例2中,先把两个4删除,两个3就合并了,再删除两个3,以此类推能删除完。
#include <bits/stdc++.h>
using namespace std;
stack<int> st;//定义一个int类型的栈
int main()
{
int n,i;
cin>>n;
int a[n];
for(i=0;i<n;i++)
{
cin>>a[i];//在输入的同时就可以完成操作
if(st.empty()) //如果栈是空的话
st.push(a[i]); //就直接把当前元素压入栈顶
else if((a[i]+st.top())%2==0) //如果当前元素加上栈顶元素的值是偶数的话
st.pop(); //那就说明这两个元素可以删除了
//因为当前元素a[i]还没有入栈,所以只要删除栈顶元素就可以了
else //如果当前元素加上栈顶元素不是偶数
st.push(a[i]); //就把当前元素送入栈顶
}
cout<<st.size();//输出栈内元素的个数
}