题目
题意
一组数字,要求在经过水平和垂直增加高度后所有数值大小一致,不能阶跃式增加,必须递增(即题目要求的不能有空)。水平增加必须是相邻两个数且增加高度为一,垂直高度增加单位高度为2,只能影响一个数。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int i,n;
cin>>n;
stack<int> a;
for (i=0;i<n;i++)
{
int temp;
cin>>temp;
if (!a.empty()&&abs((temp-a.top())%2==0))
a.pop();
else a.push(temp);
}
if (a.size()<=1)
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}
思路
相邻两个数差值为偶数的话可以用垂直方式摆平,随后可以上升至任意高度,此时可以无所谓此对数据,可将其视为不存在,接着向下看,如果要满足整个数列高度一致,在此规则下,最后只能剩下一个以下的数没有达到一样的高度,否则将永远不可能达到一样的高度(永远差1)。可以用栈来表示这个过程,栈顶元素和比较元素每达成偶数差条件,退栈,否则将比较元素入栈,直到输入完成所有元素,若栈中元素<=1,输出
YES
,否则NO
。
总结
本题分数2100,如果发现了偶数差规律,利用栈的性质很快能解决。