D1. Great Vova Wall (Version 1):

题意:给定长度为N的墙,以及每个位置的一些高度,现在让你用1*2的砖和2*1的砖去铺,问最后能否铺到高度一样。

思路:分析其奇偶性,在一个位置加1*2的砖,其奇偶性不变。在相邻的而且高度相同的位置加2*1的砖,两个奇偶行都改变。那么我们不需要保存高度,因为高度我们可以加1*2的砖,使他们等效到奇偶性的高度;所以只需要保存奇偶,然后加入栈中,如果栈顶的两个元素相同,则可以消去,最后如果栈元素<=1,则ok。

(如果最后栈为空,说明最后高度可奇可以偶;否则,最后的高度由栈里剩下的一个元素奇偶性决定。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=2000010;
int a[maxn],q[maxn],top;
bool get(int N)
{
    top=0;
    for(int i=1;i<=N;i++){
       q[++top]=a[i];
       if(top>=2&&q[top]==q[top-1]) top-=2;
    }
    if(top<=1) return true;
    return false;
}
int main()
{
    int N; scanf("%d",&N);
    rep(i,1,N) scanf("%d",&a[i]),a[i]=a[i]&1;
    if(get(N)) return puts("YES"),0;
    puts("NO");
    return 0;
}
View Code

相关文章: