题意:
n列竖直放置的砖块,每列砖块高度为ai,现有无数个2*1的砖块,可竖直放置在一列,使该列高度加2,也可以水平放置在两个相邻且高度相同的列上,使这两列高度加1,问是否可以形成一个n列高度相同的墙面。
题解:
1.思维:假如两列相邻的砖块高度相差为2的倍数,那么这两列可以变成任意高度,可以相当于去掉。若将两边的两列看为相邻的两列后具有相同的性质,可进行同样的操作。
2.这可以用栈来解决。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<stack>
#define N 200005
#define mod 1000000007
using namespace std ;
int n , a[N] ;
int main()
{
int i , j ;
stack <int> s ;
scanf("%d" , &n) ;
for(i = 1 ; i <= n ; i ++)
{
scanf("%d" , &a[i]) ;
if(!s.empty() && abs(s.top() - a[i]) % 2 == 0)
s.pop() ;
else
s.push(a[i]) ;
}
if(s.size() <= 1)
printf("YES") ;
else
printf("NO") ;
}